添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

关于C++函数返回类对象时的优化(RVO、NRVO)

C++中的函数在返回一个类对象时,理论上我们会认为通过复制构造函数复制一个临时对象,然后在赋值给外部变量。实际上编译器做了优化,省去了中间的临时对象环节。和返回值优化相关有两种机制:RVO (Return Value Optimization)、NRVO (Name RVO). 考虑函数如下:

T t = f();

优化机制使得 外部变量 t 在函数 f 内部直接构造初始化。

通过代码可以直观看到,首先定义一个类 T,重载复制构造函数和赋值运算符。再定义两个函数 f1, f2返回值类型为T,一个直接返回无名对象,一个返回有名对象。

class T {
public:
	T() { cout << "create T" << endl; }
	~T() { cout << "delete T" << endl; }
	T& operator=(const T& t) {
		cout << "create T by operator=" << endl;
		return *this;
	T(const T& t) {
		cout << "create T by copy constructor" << endl;
T f1() { //RVO
	return T();
T f2() { //NRVO
	T t;
	return t;

调用 f1、f2 产生的输出如下,两种方式都没有构造临时对象:

T t1 = f1();
//create T
//delete T
T t2 = f2();
//create T
//create T by copy constructor
//delete T
//delete T

编译器可能的优化方案,首先将函数f改写,将外部变量t传入函数内进行copy constructor。

T t = f();
//可能的优化方式如下:
void f(T& __result) {
	__result(return_value);
	return;