如果变量值存储在 LIFO 结构中,堆栈如何保存变量值?

How does the stack hold variable values if they are stored in a LIFO structure?

我对编译器如何在堆栈上存储变量感到有点困惑。我看c++可以把局部变量存入栈,但是如果栈是后进先出的,程序调用变量的时候怎么保证调用正确的变量呢?

运行-时间堆栈不仅仅是一个后进先出结构;它是一个支持随机访问的复杂结构。

通常它在许多平台上的工作方式是,当输入 na 函数时,一个新堆栈 frame 被推入堆栈(后进先出方式)。局部变量存储在框架内,并相对于存储在寄存器中的或多或少稳定的指针进行访问。

调用其他函数时,它们会推送自己的帧,但会在返回前恢复所有内容。

运行-time stacks 通常还支持 ad hoc 推送和弹出单个值,用于临时保存寄存器值或参数传递。

一个常见的实现策略是首先分配帧。例如,如果需要一个 512 字节的堆栈帧,则堆栈指针移动 512 字节。然后堆栈指针可以自由地用于推送和弹出,前提是它不会弹出太远并开始吞噬框架。

可以使用单独的 帧指针 来跟踪帧的位置。然后相对于该帧指针访问该帧,这允许堆栈指针移动而不会干扰这些访问。

编译器也可以在不使用帧指针的情况下生成代码;如果堆栈指针仅以编译器知道的方式移动,它可以调整所有变量引用。在编译器知道堆栈指针由于被压入其中而移动了四个字节的代码区域上,它可以将堆栈指针相对帧引用调整四个字节。

基本原则是,当给定函数正在执行时,堆栈处于该函数所期望的正确状态(除非由于错误导致损坏或其他原因而出现严重错误)。堆栈帧的 LIFO 分配策略紧密跟踪函数调用和 returns。被调用的函数必须保存和恢复某些寄存器("callee-saved registers"),这有助于维持稳定的堆栈环境。