【发布时间】:2021-04-08 08:20:19
【问题描述】:
我在某处读到堆栈指针在调用函数时递减以为局部变量分配空间。
我不明白这是怎么回事,因为根据我的说法,它应该增加。谁能解释一下?
【问题讨论】:
标签: stack local-variables stack-pointer
我在某处读到堆栈指针在调用函数时递减以为局部变量分配空间。
我不明白这是怎么回事,因为根据我的说法,它应该增加。谁能解释一下?
【问题讨论】:
标签: stack local-variables stack-pointer
首先,增加或减少它并不重要 - 区别仅在于 CPU 在 push/pop 操作时增加或减少 SP。这不会影响堆栈的本质:我们从堆栈中读取数据的顺序与放入时完全相反。
它的原因是历史性的:在没有基于分页的虚拟内存支持的机器上,我们有一个固定的地址空间。应该有代码、堆和堆栈以某种方式放置 - 不会相互覆盖。
程序的代码部分通常不会改变(除了 ASM 级别的自覆盖代码 - 今天几乎是超现实的,但即使在很久以前也很少见)。堆(数据)段的大小有时会增长,有时会缩小,有时还会出现碎片。堆栈只会增长或缩小,但不会分片。
这导致进程地址空间的典型内存布局是这样的:
这导致堆栈必须位于地址空间的末尾,但为了使其增长成为可能,必须在数据插入时减少它。
其他内存布局也是可能的,有一些 CPU 在数据插入时堆栈已经增长。
后来,随着基于分页的内存虚拟化的出现,这个问题本来可以大致解决(虽然如果虚拟地址空间的大小不够大,减少堆栈仍然更好)。但是没有必要为了零到一点的改进而破坏兼容性。
【讨论】: