编译器如何管理运行时堆栈

How compiler manages runtime stack?

本文关键字:运行时 堆栈 管理 何管理 编译器      更新时间:2023-10-16

在这个网站上有很多关于堆栈和堆的问题。但是我想知道编译器实际上是如何管理堆栈的?基于堆栈的分配是在运行时还是编译时决定的?请考虑以下示例:

#include <iostream>
using namespace std;
class Test {
 // Test class' data members
 public:
 // member functions
};
int main() {
  Test t; // automatic object
  // use t here
  return 0;
}

这里的问题是何时分配对象 t? 内存将在编译时还是运行时分配?我知道局部变量,对象在调用函数时被分配,当函数终止时被销毁。

基于堆栈的分配在编译时决定,并在运行时执行。当编译器"看到"Test t的声明时,它会生成代码来分配堆栈上的sizeof(Test)字节用于t,并可选择调用其ctor。当函数退出时,编译器会生成代码来调用 dtor(如果存在(并释放空间。

然而,C99引入了可变长度数组。它们也会在堆栈上分配,但如果在运行时确定它们的大小。看到这里。

希望这能回答你的问题。

编译器决定在堆栈上分配运行时。

这实际上主要取决于系统。 编译器可以估计编译时需要分配多少内存。

但是,大多数情况下,它是在运行时完成的,因为堆栈使用很难估计,因为它依赖于代码,并且根据程序执行时采用的代码路径,在运行之间可能会有所不同