C++ - 通过复制行为返回

C++ - Return by copy behavior

本文关键字:返回 复制 C++      更新时间:2023-10-16

我正在研究下面的这个小例子,只是为了更好地理解在C++中通过复制传递值的行为。

#include <iostream>
using namespace std;
class A{
public:
A(){
cout << "A()" << endl;
}
A(const A& a){
cout << "A(const A& a)" << endl;
}
A(A&& a){
cout << "A(A&& a)" << endl;
}
};
A get_A(A a){
cout << "beginning get_A()" << endl;
A a2;
cout << "end get_A()" << endl;
return a2;
}
int main() {
cout << "beginning main" << endl;
A a1;
A a2 = get_A(a1);
cout << "end main" << endl;
return 0;
}
Output:
beginning main
A()
A(const A& a)
beginning get_A()
A()
end get_A()
end main

为什么在打印end get_A()之后没有A(const A& a),因为我是复印件返回的?

这是一种称为复制省略的优化。当你调用get_a时,编译器正在构造局部a2变量来代替 main 中的a2,并省略复制/移动。

这是标准明确允许编译器执行的少数优化之一。它发生的两种情况是,当您返回具有自动存储持续时间的变量时,或者当您返回一个无名的临时变量时;虽然有一些额外的限制。