编译器如何管理运行时堆栈
How compiler manages runtime stack?
在这个网站上有很多关于堆栈和堆的问题。但是我想知道编译器实际上是如何管理堆栈的?基于堆栈的分配是在运行时还是编译时决定的?请考虑以下示例:
#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引入了可变长度数组。它们也会在堆栈上分配,但如果在运行时确定它们的大小。看到这里。
希望这能回答你的问题。
编译器决定在堆栈上分配运行时。
这实际上主要取决于系统。 编译器可以估计编译时需要分配多少内存。
但是,大多数情况下,它是在运行时完成的,因为堆栈使用很难估计,因为它依赖于代码,并且根据程序执行时采用的代码路径,在运行之间可能会有所不同
相关文章:
- "main"函数堆栈中的对象在第一个任务运行时被覆盖 (FreeRTOS)
- 运行时检查失败 #2 变量"A"周围的堆栈已损坏
- C++运行时错误与快速排序算法抛出堆栈转储错误
- 运行时检查失败 #2 - 变量"e"周围的堆栈已损坏。发生
- 运行时检查失败 #2 - 变量周围的堆栈'...'已损坏
- 在C++中使用链表的堆栈实现中,访问结构体headNode成员count和top会导致运行时错误
- 运行时检查失败 #2 - 变量"l1"周围的堆栈已损坏
- C++:此代码可以编译,但引发运行时检查失败 #2 - 围绕变量周围的堆栈'num'已损坏。发生
- 运行时检查失败 - 变量周围的堆栈已损坏
- 如何在 Linux 运行时检查堆栈使用情况?
- 我正在尝试使用回溯来解决 N queen 问题,但在编译时它会给出运行时错误(动态堆栈缓冲区溢出)
- 使用 C++ 查询 Solaris 上的运行时堆栈大小
- 调试:运行时检查失败 #2 - 变量"LoggerThread"周围的堆栈已损坏
- 运行时检查失败 #2 - 变量周围的堆栈'k'已损坏
- 运行时检查失败 #2 - 变量"数字选择"周围的堆栈已损坏
- 编译器如何管理运行时堆栈
- 到达主函数结束后发生调试运行时堆栈错误
- Visual Studio 2008 运行时堆栈溢出警告,当运算符在所有路径上<递归时警告
- 为什么运行时堆栈对象的实例变量与堆对象不同
- 用于生成函数以从运行时堆栈调用带参数的函数的模板