第四章,效率条款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 */}