繁体   English   中英

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

[英]Why in C++ is stack space allocated for local variable declarations never encountered by the thread of execution?

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

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

void f()
{
    if (false)
    {
        char chars[INT_MAX];
    }
}

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

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

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

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

这将极其依赖于编译器和优化级别。 一些编译器能够告诉if-block永远不会到达,因此根本不会为它发出代码。 其他人会。 其他人可能依赖于优化级别。 还有一些人在调用函数时为所有局部变量分配空间,而不是在输入范围时为其计算“更简单”。 这实际上类似于vanilla C行为,因为你必须在函数的开头声明所有变量(不确定是否在范围内存在范围局部变量的范围很长时间),所以它可能是一个保留从那以后。

此外,您显然遇到堆栈比堆小FAR,以及局部变量声明如何超出其容量,但我很确定这是您的示例的意图。

如果你正在寻找一个更好的“为什么他们这样做”然后发布你正在使用的编译器版本(和设置),也许其中一个创建者将作出回应。 没有那个,谁知道?

在MSVC的情况下,在未使用的局部变量处发出编译器警告(C4101)。 更多详细信息,请访问: http//msdn.microsoft.com/en-us/library/c733d5h9(v=vs.80).aspx

这取决于编译器和您使用的设置。 例如(我必须修改它以便它实际上在VS 2008中编译),以下将在Debug中抛出堆栈溢出异常但在Release中完成:

void f()
{
    if (false)
    {
        char chars[INT_MAX/2];
    }
}

int main(int argc, _TCHAR* argv[])
{
    f();
    return 0;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM