我知道像这样编写代码不是最佳实践,但它就是发生了。
它基本上是关于像这样的函数
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/