函数局部变量如何从堆栈中访问?
从http://www.learncpp.com/cpp-tutorial/79-the-stack-and-the-heap/
这是调用函数时发生的一系列步骤:
我不确定第6点如何运作。 如果所有函数参数都放在堆栈上,它们是如何访问的?
例如,如果有三个参数a
, b
和c
并且从顶部像这样放置在栈上
| a |
| b |
| c |
| |
...
|___|
现在当函数想要访问c
时会发生什么? a
和b
弹出吗?
这个堆栈是一个隐喻堆栈 。 请记住, 它仍然是一个RAM ,所以如果你知道你在找什么,你可以访问每个地址而不用弹出其他地址。
由于自动变量的大小在编译时已知 - 编译器会为每个变量标记offset
量,所以偏移量取决于堆栈启动时自动变量部分的位置[或堆栈的头部,两者都是有效的,具体实现取决于可能取决于体系结构],它只通过以下方式访问它们:每个变量的偏移量的start + offset
量。
不,他们不是。 堆栈指针(通常是esp
注册表)指向a
, esp+8h
指向b
, esp+16h
指向c
等等。 有没有必要为a
被弹出。
请注意,这是一个实现细节。 你不应该担心这些。 我给出的数字纯粹是理论上的,在某些体系结构中,递减地址赋予后面的参数,其他参数赋予其他参数。 这不能保证发生。
编辑:在我看来,这不是一个非常可靠的信息来源。 它提到堆栈和堆,但这些是实现细节,甚至可能不在那里。
任何通过堆栈实现的标准都没有限制。 例如,我生成了以下代码:
void foo(int x, int y, int z)
{
01241380 push ebp
01241381 mov ebp,esp
01241383 sub esp,0CCh
01241389 push ebx
0124138A push esi
0124138B push edi
0124138C lea edi,[ebp-0CCh]
01241392 mov ecx,33h
01241397 mov eax,0CCCCCCCCh
0124139C rep stos dword ptr es:[edi]
int c = x;
0124139E mov eax,dword ptr [x]
012413A1 mov dword ptr [c],eax
c = y;
012413A4 mov eax,dword ptr [y]
012413A7 mov dword ptr [c],eax
c = z;
012413AA mov eax,dword ptr [z]
012413AD mov dword ptr [c],eax
}
012413B0 pop edi
012413B1 pop esi
012413B2 pop ebx
012413B3 mov esp,ebp
012413B5 pop ebp
所以你看,那里没有堆栈。 运行时可以直接访问元素: dword ptr [x]
等。
它使用堆栈指针和相对地址来指出c。
链接地址: http://www.djcxy.com/p/80369.html上一篇: How are the function local variables accessed from the stack?