激活记录在堆栈中创建。这些是在程序运行期间创建和销毁的 - 堆栈区域在程序运行期间会改变其大小。
即使堆栈区域中的内存是在运行时创建的 - 内存量(激活记录大小)也是在编译时确定的。
我没有得到这样的概念:当在运行时创建堆栈区域中的内存时,如何在编译时确定激活记录的大小?
答案 0 :(得分:2)
当OS启动进程时,它会为该进程分配固定数量的空间作为堆栈使用。当函数开始或结束时,不会创建或销毁内存。它是从栈中未使用的顶部借来的。
当一个函数被调用时,它会抓取该堆栈空间(在堆栈顶部)的chuck它将自己使用(对于变量)。编译器可以扫描函数并提前计算所有函数,因为它不需要允许对每个函数进行函数调用 - 它们都是独立处理的。
当一个函数存在时,它会释放该堆栈空间(只需将堆栈指针调回原来的状态)并返回给调用者。
由于每个被调用的函数都有自己的保留并且没有来自堆栈顶部的空间,因此编译器不需要允许其他函数中调用的函数使用的堆栈空间。每个函数总是从堆栈的现有顶部(可用空间所在的位置)开始工作。
Malloc()使用堆内存,它与堆栈分开。只有局部变量才能使用堆栈。有一个名为alloca()的不安全函数也使用堆栈,但通常不会使用它,因为它不能依赖它来返回有效指针。