gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 23:37:00 25 4
gpt4 key购买 nike

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

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

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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com