什么是堆栈空间重用

时间:2018-02-22 20:49:45

标签: c gcc stack

在代码生成约定的gcc中有一个选项“-fstack-reuse”。

https://gcc.gnu.org/onlinedocs/gcc-7.1.0/gcc/Code-Gen-Options.html#Code-Gen-Options

当函数返回时;他们的堆栈也在倒带。但堆栈重用选项究竟意味着什么呢?

2 个答案:

答案 0 :(得分:3)

以前的GCC版本在重用堆栈分配时相当保守,即使对象的生命周期没有重叠。这导致很多破坏的代码引用了超出范围的局部变量或已经被破坏的临时对象。 -fstack-reuse选项可以为编译这些损坏的代码提供一定程度的支持(尽管由于其他优化可能仍然存在,它可能仍然会中断)。

该选项会影响函数返回时发生的情况。使用或不使用此选项时,堆栈帧始终被销毁,并且所有本地对象都不再存在。它只影响范围退出(命名变量被解除分配)和完成C ++中的完整表达式的评估(其中临时对象被释放)。

如果您的代码避免悬空指针,则该选项对您没用。

答案 1 :(得分:1)

GCC documentation有一个非常清楚的堆栈重用示例:

Traceback (most recent call last):
  File "it.py", line 45, in <module>
    occur_dict(a)
  File "it.py", line 28, in occur_dict
    if i in d:
TypeError: unhashable type: 'list'

因此,该选项基本上意味着每个局部变量是否具有专用堆栈空间。如果使用选项(默认),具有非重叠生存期的局部变量可能使用相同的堆栈空间(如上例中的变量int *p; { int local1; p = &local1; local1 = 10; ... } // local1 lifetime is over, but p still points to local1 { int local2; local2 = 20; ... } // local2 might reuse local1 space if (*p == 10) // out of scope use of local1 { ... } local1

它仅适用于局部变量和临时变量,它与堆栈清理无关。

堆栈清理始终在返回后发生,无论local2选项如何。但由于该选项,我们可能需要在堆栈上为相同数量的局部变量分配(并在返回后清理)更多空间。