1、函数按值返回的代码:
const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
Rational result(lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
return result;
}
Rational res = left*right;
对象生成过程:
1、被调函数中局部变量result
构造一次;(执行一次result构造)
2、返回值时 return result;
拷贝到调用栈上的临时变量里;(执行一次result到临时对象的复制构造与一次result的析构)
3、从栈上临时对象赋值到返回值res
中。(执行一次临时对象到存储返回值对象res的赋值构造运算与一次临时对象的析构)
总计: 共执行两次对象的拷贝析构与一次对象的构造。
2、返回值优化:
const Rational operator*(const Rational& lhs,
const Rational& rhs)
{
return Rational (lhs.numerator() * rhs.numerator(),
lhs.denominator() * rhs.denominator());
}
Rational res = left*right;
对象生成过程:
1、直接在调用栈中临时变量地址上构造返回值;(执行一次临时对象的构造)
2、从栈上临时对象赋值到返回值res中。(执行一次临时对象到存储返回值对象res的赋值构造运算与一次临时对象的析构)
总计: 共执行一次对象的拷贝析构与一次对象的构造。
参考资料:函数返回值传递 与 More Effective C++ 条款20
总结:
1、利用返回值优化(return value optimization)减少了一次对象的复制过程,提高了效率。