有了-O2,有人告诉我A的值总是为零,因为gcc会将B和C初始化为零?为什么?但是,正如预期的那样,如果不是-O2,由于初始化顺序不正确,A的值将是未定义的。
#include <iostream>
class ClassX
{
public:
ClassX() : C_(1), B_(2), A_(B_ + C_) {};
void print() {std::cout << A_ << std::endl;}
private:
int A_;
int B_;
int C_;
};
int main(int argc, const char *argv[])
{
ClassX x;
x.print();
return 0;
}
答案 0 :(得分:0)
编写包含此类初始化相互依赖关系的初始化列表并不是一个好习惯,因为这需要特定的数据成员声明顺序。在这种情况下,请考虑这样写:
ClassX() : C_(1), B_(2) { A_ = B_ + C_; }
此外,所有编译器都不保证数据成员的零初始化。在进程加载期间,您的数据所在的页面可能会出现零填充 ,但同样,这不能保证并且是特定于操作系统的。对于调试版本,您的内存很可能会填充非零值。