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

  • 相关阅读:
    给文章生成二维码
    用HTML5 Canvas做一个画图板
    失败多少次不要紧,人们只会记住你成功的那一次
    关于读大学的意义
    卸载Anaconda
    Anaconda基本命令
    plt.imshow()
    matplotlib不显示图片
    在Anaconda环境下使用Jupyter Notebook
    join()
  • 原文地址:https://www.cnblogs.com/nzbbody/p/3546479.html
Copyright © 2011-2022 走看看