如何访问堆栈上的变量?

时间:2009-02-08 12:58:14

标签: variables stack low-level memory-access

假设我们有这些局部变量:

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 个答案:

答案 0 :(得分:16)

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

实际上,这些变量也可以保存在处理器寄存器中。

答案 1 :(得分:5)

  

或者我错过了什么

您错过了堆栈驻留在常规内存中,这允许随机访问 - 只需向帧指针(“本地”堆栈的底部)添加适当的偏移量,然后您将获得指向存储器单元的指针值。

答案 2 :(得分:1)

  

这是否意味着要获得   a的值,d,c和的值   b必须首先弹出   堆栈?

发出的代码只是在输入函数时移动stack pointer正确的字节数。离开功能时它会向后移动相同的距离。因此,它不会单独弹出变量。假设int是4个字节,您给出的示例将移动堆栈指针16个字节。由于堆栈帧中的其他信息(例如返回地址),它实际上将其移动得比这更远。