【问题标题】:Stack Pointer is decremented to allocate space for local variables when a function is called调用函数时,堆栈指针递减以为局部变量分配空间
【发布时间】:2021-04-08 08:20:19
【问题描述】:

我在某处读到堆栈指针在调用函数时递减以为局部变量分配空间。

我不明白这是怎么回事,因为根据我的说法,它应该增加。谁能解释一下?

【问题讨论】:

    标签: stack local-variables stack-pointer


    【解决方案1】:

    首先,增加或减少它并不重要 - 区别仅在于 CPU 在 push/pop 操作时增加或减少 SP。这不会影响堆栈的本质:我们从堆栈中读取数据的顺序与放入时完全相反。

    它的原因是历史性的:在没有基于分页的虚拟内存支持的机器上,我们有一个固定的地址空间。应该有代码、堆和堆栈以某种方式放置 - 不会相互覆盖。

    程序的代码部分通常不会改变(除了 ASM 级别的自覆盖代码 - 今天几乎是超现实的,但即使在很久以前也很少见)。堆(数据)段的大小有时会增长,有时会缩小,有时还会出现碎片。堆栈只会增长或缩小,但不会分片。

    这导致进程地址空间的典型内存布局是这样的:

    1. 代码(开头)
    2. 堆(紧跟在代码后面,但请注意:它的大小不同,不能与堆栈重叠!)
    3. 堆栈(因为我们不知道堆会如何增长,所以它需要尽可能远离数据放置)。

    这导致堆栈必须位于地址空间的末尾,但为了使其增长成为可能,必须在数据插入时减少它。

    其他内存布局也是可能的,有一些 CPU 在数据插入时堆栈已经增长。

    后来,随着基于分页的内存虚拟化的出现,这个问题本来可以大致解决(虽然如果虚拟地址空间的大小不够大,减少堆栈仍然更好)。但是没有必要为了零到一点的改进而破坏兼容性。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-25
      • 1970-01-01
      • 1970-01-01
      • 2020-01-03
      • 2011-08-04
      • 1970-01-01
      • 2017-05-06
      相关资源
      最近更新 更多