【问题标题】:How compiler manages runtime stack? [duplicate]编译器如何管理运行时堆栈? [复制]
【发布时间】:2015-02-21 18:46:46
【问题描述】:

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

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

【问题讨论】:

  • 最后一句话没有回答你的问题吗?
  • "调用函数时分配对象" => 函数运行时...
  • 通常,编译器不会对堆栈做任何事情。
  • 在某些情况下,例如。当函数地址被传递给外部 API 调用时,编译器甚至不知道它可能在哪个堆栈上被调用。

标签: c++ stack-allocation


【解决方案1】:

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

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

希望这能回答你的问题。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-12-25
        • 2011-09-16
        • 2012-07-18
        • 2018-04-10
        • 2021-03-08
        • 2019-07-16
        • 2015-07-18
        • 1970-01-01
        相关资源
        最近更新 更多