zoukankan      html  css  js  c++  java
  • 【M20】协助完成“返回值优化(RVO)”

    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。优化结果很好。

  • 相关阅读:
    JAVA——return浅析
    JAVA泛型【转】
    C#——WinForm修改密码
    java获取当前时间的方式【转】
    iOS 取得单张系统图片
    iOS UIView的简单渐变效果
    UIView 添加子视图的常用方法
    IOS之UIView的tag学习
    OC学习笔记之属性详解和易错点
    oc对象函数什么时候返回值类型使用instancetype
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3546479.html
Copyright © 2011-2022 走看看