现代 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" 环境,CodeBlocks
、DevC++
和 ideone
,都使用 相同 编译器在幕后,因此在那种情况下很难进行详尽的测试。
最近的 Windows 版本(可能还有其他 OS 版本)在程序启动时将所有未初始化的内存初始化为 0。
因此所有 "uninitialized" 变量将显示为 0。
然而这取决于OS,而不是编译器。当运行这样的程序在Windows 9x(没有这个功能)下变量有随机值。
一旦堆栈被使用,堆栈上的变量将包含随机值:
void test()
{
int a;
std::cout << a;
}
int main()
{
someLargeFunction();
test();
}
变量 "a" 的值现在取决于函数 "someLargeFunction"!
我知道 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" 环境,CodeBlocks
、DevC++
和 ideone
,都使用 相同 编译器在幕后,因此在那种情况下很难进行详尽的测试。
最近的 Windows 版本(可能还有其他 OS 版本)在程序启动时将所有未初始化的内存初始化为 0。
因此所有 "uninitialized" 变量将显示为 0。
然而这取决于OS,而不是编译器。当运行这样的程序在Windows 9x(没有这个功能)下变量有随机值。
一旦堆栈被使用,堆栈上的变量将包含随机值:
void test()
{
int a;
std::cout << a;
}
int main()
{
someLargeFunction();
test();
}
变量 "a" 的值现在取决于函数 "someLargeFunction"!