回答

3

答案是......这取决于。在许多编程语言(如C或C++)中,它是由实现定义的,无论它们是否在内存中连续布局,但通常都是。这是因为通过使用单个堆栈指针并将其递增或递减来分配/取消分配内存,在堆栈上分配激活记录速度非常快。但是,不能保证语言能够做到这一点。

在其他语言中 - 尤其是支持闭包的语言 - 激活记录并非连续布置,因为激活记录的内存可能需要保存为闭包的一部分。在这种情况下,内存不一定以栈的形式分配和解除分配,因此激活记录通常分散在整个内存中。此外,使用协程或生成器(如Python)的语言不一定会将激活记录连续存储在堆栈中,因为函数处于活动状态的顺序以及它们完成的顺序不符合后进/先出模式需要一个堆栈。

+0

你能解释一下“支持闭包的语言”是什么意思?我需要一个例子,甚至可能是一个链接。 –

+0

@Am_I_Helpful我一次教授了一个编译器类,并且[有一些幻灯片在此](http://web.stanford.edu/class/archive/cs/cs143/cs143.1128/lectures/11/Slides11.pdf)if你想看看他们! – templatetypedef

+0

@templatetypedef但是我们可以维护显式链接到激活记录中的下一个/上一个记录,并在分配/释放内存时使用它们修改堆栈指针。为什么让他们连续更快呢? –