条款20 协助编译器实现返回值优化

  当重载运算符的时候,比如+ - * / 这类运算符,该函数返回的值一定是个右值(即不能是引用),那么执行一次运算的开销可能会在临时对象上调用多次构造函数和析构函数,这笔开销还是很大的。现在的新编译器已经可以对这种情况进行优化了,甚至优化到连开销都没有,只是有一定的适用范围。如果可以返回一个匿名的临时对象,并且利用构造函数来得到结果对象,那么就有可能被优化到零开销。注意,有名字的对象意味着返回值优化不可用。

  假设有如下的代码:

     node a();
node b();
node c=a+b;

  函数的原型大概是这样的:

 const node add(const node& a,const node& b)
{
return node(a,b);
}

  这里返回了一个匿名的临时对象,但是编译器可能会进行优化,甚至零开销(但是c的构造函数开销还是要的)。即使没有优化,我们尽量这么用也没有什么坏处。

条款22 考虑使用op=来取代单独的op运算符

  一般情况下,operator + 只需要定义operator +=就可以一块实现了, 主要的目的是还可以使用条款20中的优化作用,即利用构造函数来达到返回值优化的作用。例如:

 struct node
{
public:
const node& operator += (const node& rhs) const
{
...
return this;
}
}; const node operator +(const node& a,const node& b)
{
return node(a)+=b;
}

  对于返回值优化,如果加上inline内联的话,可能更好。

  这两篇其实看得不是很明白,只是知道如果这样子用估计会更高效,但是肯定不会花费更多的开销。书中也没有肯定地讲这样一定就优化得了。

《MORE EFFECTIVE C++》条款20 条款21的更多相关文章

  1. EC读书笔记系列之11:条款20、21

    条款20 宁以pass-by-reference-to-const替换pass-by-value 记住: ★尽量以pass-by-reference-to-const替换pass-by-value.前 ...

  2. FTP的20、21端口,工作模式

    什么是FTP? FTP就是文件传输协议 File Transfer Protocol 的缩写. FTP端口号是多少? 21 FTP的端口号能改吗? 能 ftp的端口号20.21有何区别? 一个是数据端 ...

  3. Effective STL 学习笔记 Item 21:Comparison Function 相关

    Effective STL 学习笔记 Item 21:Comparison Function 相关 */--> div.org-src-container { font-size: 85%; f ...

  4. Effective C++ -----条款20:宁以pass-by-reference-to-const替换pass-by-value Prefer pass-by-reference-to-const to pass-by-value

    尽量以pass-by-reference-to-const替换pass-by-value.前者通常比较高校,并可避免切割问题(slicing problem). 以上规则并不适用于内置类型,以及STL ...

  5. 《Effective C++》——条款20:宁以pass-by-reference-to-const替换pass-by-value

    切割(slicing)问题 请看下面代码: class Window { public: ... std::string name()const; //返回窗口名称 virtual void disp ...

  6. 《Effective C++》:条款48:理解力template 元编程

    Template metaprogramming(TMP,模板元编程)这是写template-based C++规划.编译过程.template metaprogramming随着C++写模板程序,化 ...

  7. Effective C++ 笔记:条款 30 inline

    30 : Understand the ins and outs of inlining 1 inline申请书 1.1 类内部实现函数包含隐藏的inline申请 class Human { publ ...

  8. 《effective C++》:条款37——绝不重新定义继承而来的缺省参数值

    引子: 阿里的一道题: #include <IOSTREAM> using namespace std; class A{ public: ) { cout<<"a~ ...

  9. Effective C++:条款27——条款

    条款27:尽量少做转型动作 单一对象可能拥有一个以上的地址!

随机推荐

  1. javascript DOM操作HTML文档

    文档对象模型(DOM)是W3C为解决浏览器混战时代不同浏览器环境之间的差别而制定的模型标准.W3C将文档对象模型定义为:是一个能让程序和脚本动态 访问和更新文档内容.结构和样式的语言平台.提供了标准的 ...

  2. linux shell 单引号 双引号 反引号的区别

    一.单引号和双引号 首先, 单引号和双引号,都是为了解决中间有空格的问题. 因为空格在linux中时作为一个很典型的分隔符,比如 string1=this is a string,这样执行就会报错.为 ...

  3. Servlet+JSP+JavaBean开发模式(MVC)介绍

    好伤心...写登陆注册之前看见一篇很好的博文,没有收藏,然后找不到了. 前几天在知乎上看见一个问题,什么时候感觉最无力. 前两天一直想回答:尝试过google到的所有solve case,结果bug依 ...

  4. PHP+mysql常用类库

    <?php /** * @title: Ekcms mysql类库 * @version: 1.0 * @author: perry <perry@1kyou.com> * @pub ...

  5. laypage分页功能demo

    demo代码如下: <div id="view1"></div> <div id="page1"></div> ...

  6. BroadcastReceiver的简介

    BroadcastReceiver本质上属于一个监听器,因此实现BroadcastReceiver的方法只要重写BroadcastReceiver的onReceive(Context  context ...

  7. static初始化问题探究

    两个小示例 demo1 package containers; public class TempTest { static{ a= 1; // System.out.println(a); } st ...

  8. 基于SOCK4网络协议的代理服务器端代码示例

    //********************************************************************** #include <stdio.h> #i ...

  9. PowerMock遇到的问题——3

    在用WhiteBox调用对象的私有方法时,如果要传的参数为空,如果直接在参数列表中写null的话,可能会报空指针异常,可以定义一个变量使他等于空,再把变量传进去就可以了.

  10. HDU 3333 树状数组离线查询

    题目大意: 询问区间内不同种类的数的数值之和 这里逐个添加最后在线查询,会因为相同的数在区间内导致冲突 我们总是希望之后添加的数不会影响前面,那么我们就在添加到第i个数的时候,把所有在1~i 的区间的 ...