成员变量与-O2和不具有的不同行为

时间:2014-02-24 08:21:42

标签: c++ gcc optimization

有了-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;
}

1 个答案:

答案 0 :(得分:0)

编写包含此类初始化相互依赖关系的初始化列表并不是一个好习惯,因为这需要特定的数据成员声明顺序。在这种情况下,请考虑这样写:

 ClassX() : C_(1), B_(2) { A_ = B_ + C_; }

此外,所有编译器都不保证数据成员的零初始化。在进程加载期间,您的数据所在的页面可能会出现零填充 ,但同样,这不能保证并且是特定于操作系统的。对于调试版本,您的内存很可能会填充非零值。