为什么在C++中是为执行线程从未遇到的局部变量声明分配的堆栈空间?

Nei*_*ice 7 c++ stack-overflow stack

为什么在C++中是为执行线程从未遇到的局部变量声明分配的堆栈空间?或者,如果C++标准未定义,为什么某些编译器会为执行线程从未遇到的局部变量声明分配堆栈空间?编译器是否只为执行线程遇到的变量声明分配堆栈空间并仍然有效?

为了说明,在调试模式下调用此函数,其中不能遇到变量字符会导致堆栈溢出:

void f()
{
    if (false)
    {
        char chars[INT_MAX];
    }
}
Run Code Online (Sandbox Code Playgroud)

Mik*_*wan 8

编译器已经提升了局部变量的声明.是否完成此操作不是由标准定义的,因此行为是特定实现的.这样做可以立即分配所有局部变量的空间,从而减少开销.

但是,通过优化,编译器会将您的特定情况标识为死代码,并且您将遇到的内容将被删除.

  • 吊装也使得`goto`的实施变得复杂得多. (2认同)

mjf*_*tes 6

1)没有理由不这样做.C++标准不保证在执行期间未输入的作用域内的变量不会为它们分配空间.

2)它更快更简单.如果一次性分配所有本地,则为本地分配空间的代码包括对函数开头的堆栈指针的一次更新,以及最后一次的更新.如果必须在该范围的开头和结尾分配和释放范围内的本地,则会获得更多的堆栈指针更新.