堆栈中的变量如何访问?

9

假设我们有这些本地变量:

int a = 0;
int b = 1;
int c = 2;
int d = 3;

据我所知,这些将被分配在系统堆栈上,如下所示:
|   |
| 3 | d
| 2 | c
| 1 | b
|_0_| a

这是否意味着为了获得a的值,必须首先从堆栈中弹出d、c和b的值?如果是这样,这些值会去哪里?这是否意味着访问最近声明的变量会更快?或者我漏了什么(我怀疑是这种情况),整个过程以某种其他方式工作?

编辑:谢谢,伙计们!
3个回答

19

栈上的局部变量通常相对于所谓的帧指针进行访问,该指针指向您的堆栈帧的开头。虽然也可以相对于栈指针进行访问,但由于在表达式求值期间它会移动,因此更难跟踪。

实际上,这些变量可能还存储在处理器寄存器中。


7

还有什么我没注意到的吗?

你忽略了栈存在于常规内存中,这使得随机访问成为可能-只需将相应的偏移量添加到帧指针(“本地”栈的底部),就可以获得指向保存值的存储单元的指针。


2
这是否意味着为了获取a的值,必须先将栈中d、c和b的值弹出?
代码发出的指令只是在进入函数时将stack pointer向前移动正确数量的字节,在离开函数时将其向后移回相同距离。因此,它并不逐个弹出变量。假设int为4字节,你给出的例子将移动栈指针16字节。实际上它会移动更多的字节,因为栈帧中还有其他信息,例如返回地址。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接