假设我们有这些局部变量:
int a = 0;
int b = 1;
int c = 2;
int d = 3;
据我所知,这些将分配在系统堆栈上,如下所示:
| |
| 3 | d
| 2 | c
| 1 | b
|_0_| a
这是否意味着为了得到a的值,必须首先将d、c和b的值从堆栈中弹出?如果是这样,这些值在哪里?这是否意味着访问最近声明的变量会更快?还是我错过了什么(我怀疑是这种情况),而整个事情以其他方式起作用?
编辑:谢谢,伙计们!
假设我们有这些局部变量:
int a = 0;
int b = 1;
int c = 2;
int d = 3;
据我所知,这些将分配在系统堆栈上,如下所示:
| |
| 3 | d
| 2 | c
| 1 | b
|_0_| a
这是否意味着为了得到a的值,必须首先将d、c和b的值从堆栈中弹出?如果是这样,这些值在哪里?这是否意味着访问最近声明的变量会更快?还是我错过了什么(我怀疑是这种情况),而整个事情以其他方式起作用?
编辑:谢谢,伙计们!
堆栈上的局部变量通常是相对于所谓的帧指针访问的,它指向堆栈帧的开头。也可以相对于堆栈指针执行此操作,但由于它在表达式评估期间移动,因此更难以跟踪。
实际上,这些变量也可以保存在处理器寄存器中。
或者我错过了什么
你错过了堆栈驻留在常规内存中,它允许随机访问 - 只需将适当的偏移量添加到帧指针(“本地”堆栈的底部),你就会得到一个指向保存该值的内存单元的指针。
这是否意味着为了得到a的值,必须首先将d、c和b的值从堆栈中弹出?
The code emitted simply moves the stack pointer the correct number of bytes when entering the function. It moves it back the same distance when leaving the function. Thus, it does not pop off the variables individually. Assuming an int is 4 bytes, the example you gave would move the stack pointer 16 bytes. It actually moves it further than this because of other information in the stack frame such as the return address.