0

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

#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?内存将在编译时或运行时分配?我知道局部变量,对象在函数被调用时被分配并在函数终止时被销毁。

4

3 回答 3

2

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

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

希望这能回答你的问题。

于 2014-12-23T16:37:08.073 回答
0

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

于 2014-12-23T15:42:35.280 回答
0

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

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

于 2014-12-23T15:47:47.853 回答