gpt4 book ai didi

c++ - 何时需要/应用返回值优化?

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:52:17 25 4
gpt4 key购买 nike

我对返回值优化有点困惑,这是示例。

#include <iostream>
using namespace std;
class A{
int x;
public:
A(int val=0):x(val){
cout << "A" << x << endl;
}
A(const A& a){
x=a.x;
cout << "B " << x << endl;
}
void SetX(int x){
this -> x=x;
}
~A(){
cout << "D " << x << endl;
}
};
A f(A a){
cout << "C " << endl;
a.SetX(100);
return a;
}
int main(){
A a(1);
A b=f(a); // Why Copy constructor instead of RVO?
b.SetX(-100);
return 0;
}

输出

A 1 // ok
B 1 // ok
C // ok
B 100 // why it's here? Why copy constructor instead of RVO?
D 100 // why after the above line? it should be before the above line.
D -100 // ok
D 1 // ok

我对 B 100 和 D 100 的输出有点困惑。

1) 为什么编译器给 B 100 输出它应该是 RVO(不应该调用复制构造函数)。

2) 第二个是,如果调用复制构造函数,则 D 100 应该在 B 100 之前,因为在 fun() 中函数对象超出范围。在 A b=f(a); 语句之前。

最佳答案

首先,永远不需要 RVO。这是允许的,这使它有很大的不同。

编辑。

关于构造函数的顺序,我最初的回答是不正确的。我错过了输出中的那一行,事实上,它只是意味着复制省略没有完全发生。在 3 个语义拷贝中(通过 return a 从 f() 到临时位置;从临时位置到 b=f(a) 的右侧;从右侧到 b)一个没有被删除并且完整复制。我不知道是哪一个。

关于c++ - 何时需要/应用返回值优化?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32253959/

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