首页 > 其他 > 详细

【M20】协助完成“返回值优化(RVO)”

时间:2014-02-13 04:08:36      阅读:330      评论:0      收藏:0      [点我收藏+]

1、方法返回对象,会导致临时对象的产生,这降低了效率,const Rational operator* (const Rational& lhs,Rational& rhs)。有没有什么解决办法呢?

2、试图返回引用,方法内的局部对象,在方法执行完后销毁,这个引用指向垃圾。不可行。

3、试图返回指针,这导致奇怪的语法Rational c = *(a*b); 并且要求客户执行delete,这不合理。就算客户正确执行delete,有些情况,方法返回值没有暴露指针,客户无法执行delete,比如:Rational d = *(a*b*c); 不可行。

4、因此,必须返回对象。那该怎么办呢?

  编译器会进行优化,避免临时对象的产生。但是,编译器需要你的协助。 也就是使用constructor arguments取代对象。如下:

  const Rational operator*(const Rational& lhs,const Rational& rhs)

  {

    return Rational(lhs.numerator()*rhs.numerator(),  lhs.denominator()*rhs.denominator());

  }

  这种方式有个专属名称:返回值优化RVO(Return Value Optimization)。

5、使用上面的constructor arguments,考虑Rational c = a*b; 编译器优化的结果是:消除operator*方法内的局部对象,同时消除方法返回值的临时对象,使用return表达式直接构造c。优化结果很好。

【M20】协助完成“返回值优化(RVO)”

原文:http://www.cnblogs.com/nzbbody/p/3546479.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!