什么是堆栈空间重用

Red*_*row 5 c stack gcc

在代码生成约定的gcc中有一个选项"-fstack-reuse".

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

功能返回时; 他们的堆栈也在倒带.但堆栈重用选项究竟意味着什么呢?

Flo*_*mer 5

以前的 GCC 版本在重用堆栈分配时相当保守,即使对象的生命周期不重叠。这导致许多引用超出范围的局部变量或已经破坏的临时对象的损坏代码意外地工作。该-fstack-reuse选项为编译此类损坏的代码提供一定程度的支持(尽管由于其他优化的启动,它可能仍然会损坏)。

该选项不会影响函数返回时发生的情况。不管有没有这个选项,堆栈帧总是被破坏,并且所有本地对象都不再存在。它仅影响范围退出(其中命名变量被释放)和 C++ 中完整表达式的求值完成(其中临时对象被释放)。

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