#include <iostream>
class MyClass
{
public:
MyClass() :
mFirst()
{
}
int mFirst;
int mSecond;
};
int main()
{
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;
}
该计划的预期产出是多少?
我认为只有MyClass.mFirst
会被初始化为零。但是,即使启用了优化,GCC也会将它们全部初始化为零:
$ g++ -o test -O3 main.cpp
$ ./test
mc.mFirst: 0
mc.mSecond: 0
a: 0
我想知道:
根据Erik的说法,值为零,因为我的堆栈恰好包含零。我尝试使用这个结构强制堆栈为非零:
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
任何人都可以解释原因吗?
好的我明白了。 GCC可能正在优化掉未使用的变量。
此应用程序显示预期的行为:
#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
答案 0 :(得分:4)
他们是(编辑:使用“他们”,我指的是mSecond,而未明确初始化的)未初始化。您的堆栈恰好包含0,因此这是您获得的值。
8.5 / 9:
如果没有为a指定初始值设定项 对象,对象是(可能是 cv-qualified)非POD类类型(或 对象应该是 默认初始化;如果对象是 const限定类型, 基础类型应具有 用户声明的默认构造函数。 否则,如果没有初始化器 为非静态对象指定的 对象及其子对象(如果有) 有一个不确定的首字母 值;如果对象或其中任何一个 子对象具有const限定条件 类型,该程序是不正确的。
答案 1 :(得分:1)
它们被归类为“未定义”,表示编译器决定的内容或创建时该位置的内存中的任何内容。基本上,让他们没有初始化是让它有机会,你应该初始化它们。没有初始化我可以想到的结构成员的唯一原因是,如果你有一个非常非常大的数组,并且不想多次调用构造函数。