C++ 基本数据类型的初始值
我想知道: 如何根据C++标准初始化每个值?C++ 基本数据类型的初始值,c++,C++,我想知道: 如何根据C++标准初始化每个值? 为什么GCC将它们全部初始化为零 更新 根据Erik的说法,这些值是零,因为我的堆栈恰好包含零。我尝试使用以下构造强制堆栈为非零: $ g++ -o test -O3 main.cpp $ ./test mc.mFirst: 0 mc.mSecond: 0 a: 0 有人能解释为什么吗 更新2 好吧,我知道了。GCC可能在优化未使用的变量 此应用程序显示了预期的行为: mc.mFirst: 0 mc.mSecond: 0 a: 0 它们(编辑:用
$ g++ -o test -O3 main.cpp
$ ./test
mc.mFirst: 0
mc.mSecond: 0
a: 0
有人能解释为什么吗
更新2
好吧,我知道了。GCC可能在优化未使用的变量
此应用程序显示了预期的行为:
mc.mFirst: 0
mc.mSecond: 0
a: 0
它们(编辑:用“它们”表示未显式初始化的mSecond和a)未初始化。您的堆栈恰好包含0,因此这就是您得到的值
8.5/9:
如果未为指定初始值设定项
对象,并且该对象是
cv合格)非POD类类型(或
阵列),对象应为
默认初始化;如果对象是
对于const限定类型
基础类别类型应具有
用户声明的默认构造函数。
否则,如果没有使用初始值设定项
为非静态对象指定的
对象及其子对象(如果有),
起首字母不确定
价值如果对象或其任何
子对象是常量限定的
类型,则程序的格式不正确
它们被归类为“未定义”,即编译器决定的内容或创建时该位置内存中的内容。基本上,让它们未初始化就是让它由机会决定,你应该初始化它们。我能想到的不初始化结构成员的唯一原因是,如果您有一个非常非常大的数组,并且不想多次调用构造函数。不是
mFirst
初始化为零,因为它在构造函数的initilizerlist中显式初始化为默认值?@Space:编辑并澄清了“它们”:
int main()
{
// Fill the stack with non-zeroes
{
int a[100];
memset(a, !0, sizeof(a));
}
MyClass mc;
std::cout << "mc.mFirst: " << mc.mFirst << std::endl;
std::cout << "mc.mSecond: " << mc.mSecond << std::endl;
int a;
std::cout << "a: " << a << std::endl;
return 0;
}
mc.mFirst: 0
mc.mSecond: 0
a: 0
#include <iostream>
struct MyClass
{
MyClass() : mFirst() { }
MyClass(int inFirst, int inSecond) : mFirst(inFirst), mSecond(inSecond) { }
int mFirst;
int mSecond;
};
int main()
{
// Fill the stack with non-zeroes
// Use volatile to prevent GCC optimizations.
{
volatile MyClass mc(1, 2);
volatile int a = 3;
}
{
volatile MyClass mc;
volatile int a;
std::cout << "mc.mFirst: " << mc.mFirst << std::endl;
std::cout << "mc.mSecond: " << mc.mSecond << std::endl;
std::cout << "a: " << a << std::endl;
}
return 0;
}
$ g++ -o test main.cpp
$ ./test
mc.mFirst: 0
mc.mSecond: 2
a: 3