c++ - 在同一行中声明对象和调用函数时发生意外优化

标签 c++

我知道像这样编写代码不是最佳实践,但它就是发生了。

它基本上是关于像这样的函数

C &foo(C &c); // will assign value to c and return c

还有一行通过函数自赋值来初始化一个对象,比如

C c = foo(c);

这是我的简化代码:

class C {
        public:
        C(int i): _i(i) {}
        C(const C& c): _i(c._i){}
        int _i;
};



C &foo(C &c) {
        c = 10;
        return c;
}



int main() {
        C c = foo(c);
        cout << c._i << endl;
        return 0;
}

如果使用 -O3 编译,该函数会产生不同的结果。没有优化,结果是预期的 10。使用 -O3,结果变为 0。我知道 gcc 必须优化掉某些东西,很可能是关于 C 的构造函数,但我无法弄清楚。

如果 C 被替换为原始类型,例如int,那么该函数在优化代码和非优化代码之间产生相同的结果。

最佳答案

这与优化无关;您的程序的行为没有明确定义。当您更改某些编译器设置时,您会观察到相应的后果。

当您将对 c 的引用传递给 foo 时,它还没有被初始化。您可以使用它,但只能以有限的方式使用。在这里,您为其分配一个结果。然后你再次返回引用。 然后它从自身进行复制初始化。显然,初始化不能发生在赋值之后。

修改您的方法。

为什么不简单点呢?

C c;
foo(c);

关于c++ - 在同一行中声明对象和调用函数时发生意外优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58556774/

相关文章:

c++ - 使用 opencv 进行视频稳定

循环中的 C++ 开关在再次运行之前变为默认值

c++ - Visual Studio 2010 - 2015 不使用 ymm* 寄存器进行 AVX 优化

c++ - 在 HardwareStore 类中找不到匹配的构造函数 (C++)

c++ - 添加到整数对 vector 和字符串 vector 的元素在函数返回时被清除

c++ - 仅通过按位运算反转(翻转)数字的最后 n 位

c++ - 为什么此生成文件适用于 make 3.81 而不是 3.82?

c++ - C++ 中的 decltype 和范围运算符

c++ - 检查彼此相邻的两个下划线

c++ - 找不到 -lbgi 和 ld 返回 1 个退出状态错误