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)”的更多相关文章

  1. C++返回值优化RVO

    返回值优化,是一种属于编译器的技术,它通过转换源代码和对象的创建来加快源代码的执行速度.RVO = return value optimization. 测试平台:STM32F103VG + Keil ...

  2. 返回值优化 RVO

    <深度探索C++对象模型>-- 2.3 返回值的初始化 & 在编译器层面做优化

  3. 返回值优化(RVO)

    C++的函数中,如果返回值是一个对象,那么理论上它不可避免的会调用对象的构造函数和析构函数,从而导致一定的效率损耗.如下函数所示: A test() { A a; return a; } 在test函 ...

  4. 一段小代码秒懂C++右值引用和RVO(返回值优化)的误区

    关于C++右值引用的参考文档里面有明确提到,右值引用可以延长临时变量的周期.如: std::string&& r3 = s1 + s1; // okay: rvalue referen ...

  5. [转] C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  6. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  7. 转:C++中临时对象及返回值优化

    http://www.cnblogs.com/xkfz007/articles/2506022.html 什么是临时对象? C++真正的临时对象是不可见的匿名对象,不会出现在你的源码中,但是程序在运行 ...

  8. C++返回值优化

    返回值优化(Return Value Optimization,简称RVO)是一种编译器优化机制:当函数需要返回一个对象的时候,如果自己创建一个临时对象用于返回,那么这个临时对象会消耗一个构造函数(C ...

  9. C++标准库之string返回值研究

    先说结论(不一定适用所有环境): 1) GCC默认开启了返回值优化(RVO),除非编译时指定“-fno-elide-constructors”: 2) 现代C++编译器一般都支持返回值优化: 3) s ...

随机推荐

  1. [SharePoint 2010]关于基于声明(Claims)的用户认证模式

    转:http://blog.csdn.net/zw_2011/article/details/7417132 SharePoint 2010在用户认证模式上,较之以前的版本有了非常大的改变.在Shar ...

  2. C#网络资源列表

    1, http://club.topsage.com/thread-371996-1-1.html

  3. Tableau学习笔记之四

    创建基本变量图表: 1.可以创建表格,条形图,饼图,直方图,线图,堆积条形图,箱线图等. 2.根据自己选择的变量和维度的数量,Tableau中的“智能显示”会相应的提醒,可以绘制哪些图形,可以绘制的一 ...

  4. 【原】Storm 入门教程目录

    Storm入门教程 1. Storm基础 Storm Storm主要特点 Storm基本概念 Storm调度器 Storm配置 Guaranteeing Message Processing(消息处理 ...

  5. 在windows7下配置PHP访问ICE中间件(ICE3.5.1+PHP5.4+Apache2.2 for vc9)

    按照ICE的官方文档(http://doc.zeroc.com/display/Ice/Using+the+Windows+Binary+Distribution#UsingtheWindowsBin ...

  6. 卸载 Cloudera Manager 5.1.x.和 相关软件【官网翻译】

    问题导读: 1.不同的安装方式,卸载方法存在什么区别?2.不同的操作系统,卸载 Cloudera Manager Server and 数据库有什么区别? 重新安装不完整如果你来到这里,因为你的安装没 ...

  7. Hadoop Hive概念学习系列之为什么Hive里,要用mysql?(四)

    想说的是,hive只是个工具,包括它的数据分析,依赖于mapreduce,它的数据管理,依赖于外部系统. metastore_db,是在哪目录下运行,在哪里产生数据. 由此可见,你在哪路径下,执行hi ...

  8. work_6

    这次的作业是阅读C++11的新特性并提出问题,作为一个大部分代码都是用C++的基本语法并没有特别关注C++一代又一代新特性的学生来说,首先我阅读了一些关于新特性的文章.为了更快的理解,我首先选择了阅读 ...

  9. Struts2的国际化

    1.概述 把在无需改写源代码即可让开发出来的应用程序能够支持多种语言和数据格式的技术称为国际化. 与国际化对应的是本地化, 指让一个具备国际化支持的应用程序支持某个特定的地区 Struts2国际化是建 ...

  10. 用C语言实现ipv4地址字符串是否合法

    用程序实现ipv4地址字符串是否合法,主要考察的是C字符串的操作. 搜索了下,网上没有特别好的实现,自己实现了下,见笑于大家,请指正. #include <stdio.h> #includ ...