【问题标题】:size of a stack frame always fixed?堆栈帧的大小总是固定的?
【发布时间】:2013-06-30 01:04:52
【问题描述】:

在 C++ 程序执行期间,特定函数的堆栈帧是否始终具有恒定大小,或者编译器在某些情况下是否允许进行动态堆栈管理,类似于 alloca() 函数所做的事情?为了更好地描述它,我的意思是堆栈帧中特定局部变量或对象的偏移量可能会在函数的不同执行时发生变化

【问题讨论】:

  • 单独的作用域可能会由于析构函数的过早调用而改变当前的堆栈布局..
  • 允许编译器使用寄存器来表示变量;不需要堆栈帧。在使用寄存器的情况下,栈帧的大小为零。

标签: c++ function size callstack


【解决方案1】:

至少在大多数典型实现中,可变参数函数的堆栈帧会根据传递的变量数量而变化。例如:

printf("%d", 1); // stack frame contains 1 pointer, one int
printf("%d %d", 1, 2); // stack frame contains one pointer, 2 ints.

实现是否与alloca 特别相似取决于实现(尤其是因为alloca 不是标准的,所以实现方式或什至可能会有所不同)。

【讨论】:

  • 具体来说,我的意思是,如果特定局部变量相对于 ebp 寄存器指向的地址的偏移量可能会在函数的不同运行时发生变化
【解决方案2】:

编译器可以随心所欲,毕竟它会生成代码,只要它按照 C++ 中的程序执行的操作就可以了。通常,编译器会尽可能计算函数所需的总堆栈空间并预先保留(减少写入堆栈寄存器的次数),即使对象是按需创建和销毁的。

【讨论】:

    【解决方案3】:

    在常见的实现中,局部变量被放置在栈帧上。一些函数可能具有由寄存器容纳的变量,而另一些函数则将变量放在堆栈上。

    堆栈帧也可以由语句块中声明的非静态变量扩展。

    堆栈帧没有标准的最小尺寸。堆栈帧的最大大小取决于平台和实现。一个常见的实现是让栈向堆扩展,堆向栈扩展。

    【讨论】:

      【解决方案4】:

      标准没有说明它(它甚至不需要你有一个堆栈),并且对于 C++14,可能需要像 alloca 这样的东西,因为它可能会获得 C99 VLA 的“轻量级”版本.

      【讨论】:

        猜你喜欢
        • 2015-09-04
        • 1970-01-01
        • 2011-12-05
        • 2014-02-25
        • 2013-11-04
        • 2015-12-11
        • 2015-05-05
        • 1970-01-01
        • 2014-12-25
        相关资源
        最近更新 更多