Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/cmake/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Memory management 如果变量被分配到堆栈上,如何随时检索它们?_Memory Management_Callstack - Fatal编程技术网

Memory management 如果变量被分配到堆栈上,如何随时检索它们?

Memory management 如果变量被分配到堆栈上,如何随时检索它们?,memory-management,callstack,Memory Management,Callstack,据我所知,每个线程通常只获得一个堆栈(而进程中的所有线程通常共享一个堆)。我一直认为堆栈用于存储函数调用时程序计数器(PC)的值。但后来我在某个地方读到,某些变量类型,如integer或boolean也被分配到堆栈中。由于堆栈上的值是以严格的FILO方式管理的,因此如何随时检索这些变量 例如,在声明inta、b、c之后,我可以在其范围内的任何时间以任何顺序对这些变量执行任何操作。这是怎么做到的?为什么值c不在堆栈顶部,从而隐藏值a,b?调用堆栈也用于局部变量,也用于将参数传递到函数中 您是对的,

据我所知,每个线程通常只获得一个堆栈(而进程中的所有线程通常共享一个堆)。我一直认为堆栈用于存储函数调用时程序计数器(PC)的值。但后来我在某个地方读到,某些变量类型,如
integer
boolean
也被分配到堆栈中。由于堆栈上的值是以严格的FILO方式管理的,因此如何随时检索这些变量


例如,在声明
inta、b、c之后,我可以在其范围内的任何时间以任何顺序对这些变量执行任何操作。这是怎么做到的?为什么值
c
不在堆栈顶部,从而隐藏值
a,b

调用堆栈也用于局部变量,也用于将参数传递到函数中

您是对的,在堆栈上传递“值类型”,而在堆上分配引用类型,但当引用类型用作参数时,指向此堆位置的指针仍将在堆栈上传递

尽管堆栈通常被视为后进先出缓冲区,但也有与调用堆栈相关联的帧或基指针,它们可用于直接访问当前堆栈指针上方或下方的内存。这就是函数在不更改堆栈指针的情况下仍然可以随机访问参数的方式

这可能有助于形象化这一点,尽管注意到许多人认为堆栈应该“向下”增长


这篇博文解释了英特尔调用堆栈

首先,我建议您应该对堆栈进行更多的研究(通过谷歌/CS书籍查看和和其他)

但是,对于您的特定问题,所有不是堆生成的变量都在堆栈上。这通常包括在一个特定函数中定义的任何东西,这些函数不是直接堆分配的(通过<代码>新< /Cord>运算符在C++和java中)。在某些语言中,所有内容都是堆分配的,只有指向这些堆结构的指针存储在堆栈上(如Python中)。您将看到各种语言之间的细微变化

因此,您关于整型和布尔型始终在堆栈上的声明是不正确的。如果在函数中定义它们,则它们位于堆栈上;如果使用
new
构建它们,则它们位于堆上。请注意,对于Java,如果使用
int
原语,它通常是基于堆栈的,
Integer
对象是基于堆的——但这是Java在基本堆栈知识之外更高级的细微差别


您可以访问
inta、b、c都在同一范围内,因为它为该函数堆栈范围内的所有3个变量腾出空间。当函数返回时,这些变量会随着堆栈向上移动而被清除。在这一点之前,所有3个都存在,因为整个范围块同时是堆栈的FILO结构的一部分,并且将持续到您返回为止。

这个问题有很多答案,这取决于您所处的环境。当然,您不应该将(与机器代码POP和PUSH一起使用的)指令中的处理器堆栈与python解释器或.net运行时使用的堆栈(或者更准确地说是stackframe)等同起来

但简单的回答是堆栈的顶部只是一个内存位置,所以您只需使用偏移量

如果你按了a,b,c

所以b的地址应该是堆栈地址-4