【问题标题】:Different behavior of member variable with -O2 and without有 -O2 和没有 -O2 的成员变量的不同行为
【发布时间】:2014-02-24 08:21:41
【问题描述】:

使用 -O2,有人告诉我 A 的值将始终为零,因为 gcc 会将 B 和 C 初始化为零?为什么?但是,正如预期的那样,如果没有 -O2,由于 init 顺序不正确,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;
}

【问题讨论】:

  • 您应该要求某人为您提供 GCC 文档中的参考资料。
  • 初始化顺序是它们被声明的顺序。所以 A 首先被初始化。所以你的代码有未定义的行为。
  • 即使那是真的,那也是不可操作的。你仍然会因为编写这样的代码而被解雇。
  • 希望有人用-Wall编译。

标签: c++ gcc optimization


【解决方案1】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-17
    • 2017-08-10
    • 2019-11-29
    • 1970-01-01
    • 2016-09-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多