RVO (return value optimization) 和NRVO (named return value optimization) 是C++在处理 “返回一个class object的函数” 时常用的优化技术,主要作用就是消除临时对象的构造和析构成本。目前我正在研究《深度探索C++对象模型》,对于这两种常见的编译器优化有了初步的了解。接下来以一个名叫Point3d的类和一个factory函数为例来总结一下。
Point3d类定义如下:
class Point3d
{
public:
Point3d(int x = 0, int y = 0, int z = 0): x(x), y(y), z(z)
{
cout << "constructor ";
cout << this->x << " " << this->y << " " << this->z << endl;
}
Point3d(const Point3d &other): x(other.x), y(other.y), z(other.z)
{
cout << "copy constructor" << endl;
}
~Point3d()
{
cout << "destructor" << endl;
}
Point3d& operator=(const Point3d &rhs)
{
if (this != &rhs)
{
this->x = rhs.x;
this->y = rhs.y;
this->z = rhs.z;
}
cout << "operator = " << endl;
return *this;
}
int x;
int y;
int z;
};
我们定义了三个成员变量x, y, z,为了简单起见,我们将它们都定义为public访问属性。接下来,我们定义了该类的默认构造函数、拷贝构造函数、赋值运算符和析构函数,它们都会通过打印一些字符来追踪函数调用。为了简单起见,我们不定义移动构造函数和移动赋值运算符。
接下来我们定义一个函数factory,它产生并返回一个Point3d对象:
Point3d factory()
{
Point3d po(1, 2, 3);
return po;
}
整体代码如下