第四章,效率

条款20 协助完成返回值优化(RVO)

返回值优化(RVO)

class Rational{
public:
Rational(int numberator = 0, int denominator = 1);
...
int numerator() const;
int denominator() const;
};

//CASE 1 函数直接返回对象
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
Rational result;
//计算
result = ...
return result;//显然会产生临时对象,需要对其构造析构消耗成本
}
//CASE 2 返回指针(危)
const Rational* operator*(const Rational& lhs, const Rational& rhs)
{
Rational* result = new Rational();
//计算
result = ...
return result;

/*虽然避免了临时对象的构造析构,但是new会调用操作系统函数减慢程序执行,
并且后续需要维护这个返回的指针,提高了资源泄漏风险*/
}
//CASE 3 返回引用(危)
const Rational& operator*(const Rational& lhs, const Rational& rhs)
{
Rational result;
//计算
result = ...
return result;
//返回一个局部对象的引用,正常人不会这么干;当函数返回后,局部对象会被销毁,引用无效
}

//RVO CASE (正解)
const Rational operator*(const Rational& lhs, const Rational& rhs)
{
return Rational(...);
/*当函数返回匿名临时对象时,C++允许编译器将临时对象优化,使他们不存在:
编译器将return表达式所定义的对象构造于承接函数返回值的变量的内存内。
Rational a = 10;
Rational b(1, 2);
Rational c = a * b;//调用operator*
等同 Rational c = Rational(a与b的计算结果);
也就是说,这样做就会让调用operator*时产生的临时对象成本为0
*/
}