返回值优化(Return value optimization,缩写为RVO)是C++的一项编译优化技术,即删除保持函数返回值的临时对象。这可能会省略两次复制构造函数。当一个函数返回一个对象实例,一个临时对象将被创建并通过复制构造函数把目标对象复制给这个临时对象。C++标准允许省略这些复制构造函数,从某种程度上可以提高程序的运行效率,对需要分配大量内存的类对象其值复制过程十分友好。
举例
//test.cpp
#include <iostream>
using namespace std;
class A
{
public:
A(){cout<<"constructor"<<endl;}
A(const A& a){cout<<"copy constructor"<<endl;}
~A(){cout<<"destructor"<<endl;}
};
A fun()
{
A a1;
return a1;
}
int main()
{
A a2=fun();
return 0;
}
关闭返回值优化
g++ -o a test.cpp -fno-elide-constructors
constructor //构造a1
copy constructor //a1复制到临时变量
destructor //析构a1
copy constructor //临时变量复制到a2
destructor //析构临时变量
destructor //析构a2
保留返回值优化
constructor //构造a1
destructor //析构a1
如果我们打印一下地址就会发现
constructor 0x7ffda7ce023f
destructor 0x7ffda7ce023f
构造和析构的是同一个对象实例
编译器明确知道函数会返回哪一个局部对象,那么编译器会把这个局部对象的地址和临时对象的地址进行复用,也就是说避免了从局部对象到临时对象的拷贝操作,这就是RVO。
参考:
编译器之返回值优化