现代 C++ 编译器是否会自动将局部变量初始化为 0?

Is it true that modern C++ compilers automatically initializes local variables to 0?

我知道 C 和 C++ 中的局部变量不会自动初始化,如果没有给它们初始值,它们就会有垃圾值。我也知道全局和静态变量默认初始化为零。使用未初始化的变量会导致 C++ 中的未定义行为。

但最近我尝试在 C++ 的各种实现上遵循简单的 C++ 程序,所有输出都为 0。

#include <iostream>
int main()
{
    int u;
    std::cout<<u<<'\n';
}

输出:

代码块 13.12 IDE:0

Orwell Dev C++ 5.8.3: 0

Ideone.com: 0(访问这个:http://ideone.com/zWrgwo

现代编译器自动将局部变量初始化为0是真的吗?或者这种类型的程序仍然代表未定义的行为?是否保证始终将 0 视为每个现代 C++ 实现的输出?

不,这不是真的。将变量初始化为零会产生不必要的性能成本。非静态变量未初始化为零。

在 C++ 中使用未初始化变量的行为是未定义的。

您可能会发现调试配置零初始化变量。我发现这特别有害,并始终确保关闭所有执行此操作的编译器选项。

具体实现可以自由地不将它们("local" 变量)设置为任何值,或将它们设置为他们想要的任何值,包括零。毕竟,该标准不强制将它们设置为非零值 :-)

该标准仅声明它们的值如果未明确设置,则未定义。因此,优秀的程序员不会依赖它。这在C++11 8.5 Initializers [dcl.init] /11(我的重点)中有介绍:

If no initializer is specified for an object, the object is default-initialized; if no initialization is performed, an object with automatic or dynamic storage duration has indeterminate value.

因此,在回答您的结束问题 is it guaranteed to see 0 as output on every modern implementation of C++ always? 时,答案是否定的,简单明了。

顺便说一句,您可能会发现您测试的三个 "separate" 环境,CodeBlocksDevC++ideone,都使用 相同 编译器在幕后,因此在那种情况下很难进行详尽的测试。

最近的 Windows 版本(可能还有其他 OS 版本)在程序启动时将所有未初始化的内存初始化为 0。

因此所有 "uninitialized" 变量将显示为 0。

然而这取决于OS,而不是编译器。当运行这样的程序在Windows 9x(没有这个功能)下变量有随机值。

一旦堆栈被使用,堆栈上的变量将包含随机值:

void test()
{
    int a;
    std::cout << a;
}

int main()
{
    someLargeFunction();
    test();
}

变量 "a" 的值现在取决于函数 "someLargeFunction"!