1、inline方法相当于文本替换,不需要承担方法调用的额外开销,同时还有潜在的优势,文本替换后,编译器会进行代码优化。而对于方法调用,编译器没有能力进行代码优化。

2、显而易见,inline方法往往会导致目标代码膨胀变大。但是,对于方法本体很小的情况,可能会出现,替换后的文本比方法调用的代码还要小。这也意味着,一般情况下,只有方法本体比较小的情况,才应该声明为inline。

3、特别注意:inline只是一个申请,而不是命令。同时,对于class定义中的方法实现,也暗示着申请inline。申请inline告诉编译器,进行文本替换,但最终能不能文本替换,还要取决于编译器。

4、编译器拒绝对业务复杂(包含循环和递归)的方法inlining,同时拒绝对virtual方法执行inlining,为啥?

  virtual方法是运行时确定调用哪个方法,而inline是编译时文本替换,二者矛盾。

5、当取inline方法地址的时候,也不进行文本替换,为啥?

  这种情况是取地址,进行文本替换没有意义。

6、构造方法和析构方法不应该是inline,为啥?

  C++对于“对象被创建和被销毁时发生什么事”做个保证。比如:构造过程出现异常,C++保证构造好的那一部分自动销毁。这就意味着,为了满足这种保证,C++在构造方法中,增加了一些代码。如果将构造方法声明为inline,意味着文本替换,这就妨碍编译器添加一些代码。

7、考虑下面的情况,其他程序集使用一个方法,这个方法做了修改。如果这个方法是inline,意味着外部程序集必须重新编译,重新进行文本替换。而如果不是inline,外部程序集不需要重新编译。

8、显然,inline方法不能很好地支持调试。有些调试器勉强支持调试,为了支持调试inline,大多数调试器的做法是:在调试版本禁止inlining。

9、正确的做法是:一开始不要声明为inline,在后期找到效率的瓶颈所在,如果是方法调用导致的原因,再进行inline。

【30】透彻了解inlining 的里里外外的更多相关文章

  1. Effective C++ -----条款30:透彻了解inlining的里里外外

    将大多数inlining限制在小型.被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化 ...

  2. [Effective C++ --030]透彻了解inlining的里里外外

    引言  inline函数 在函数声明或定义中函数返回类型前加上关键字inline即把min()指定为内联. inline函数对编译器而言必须是可见的,以便它能够在调用点内展开该函数.与非inline函 ...

  3. [Effective C++系列]-透彻了解inlining的里里外外

    Understand the ins and outs of inlining.   [原理] Inline函数背后的做法是将“对函数的每一个调用”都用函数本体(function body)替换之.其 ...

  4. 条款30:透彻了解inline的里里外外(understand the ins and outs of inlining)

    NOTE: 1.将大多数inline限制在小型 被频繁调用的函数身上.这可使日后的调试过程和二进制升级(binary upgradability)更容易,也可使潜在的代码膨胀问题最小化, 使程序的速度 ...

  5. 条款30:透彻了解inline的里里外外。

    inline可以带来各种好处: 首先其可以使得消除函数调用带来的开销,再者编译器对这种非函数的代码可以做出更多的优化策略.   但是inline函数首先肯定是会导致程序代码的大小更加的庞大,这样会带来 ...

  6. 读书笔记 effective c++ Item 30 理解内联的里里外外 (大师入场啦)

    最近北京房价蹭蹭猛涨,买了房子的人心花怒放,没买的人心惊肉跳,咬牙切齿,楼主作为北漂无房一族,着实又亚历山大了一把,这些天晚上睡觉总是很难入睡,即使入睡,也是浮梦连篇,即使亚历山大,对C++的热情和追 ...

  7. EC读书笔记系列之14:条款26、27、28、29、30、31

    条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...

  8. Effective C++ 的55个条款

    看完Effective C++才觉得平时程序设计时需要注意的一些问题,有一定的收获,不过因为没什么项目实践, 并未很深入了解具体情况如何,还需后继实践~ 列举一下55个条款: 1. 视C++为一个语言 ...

  9. Effective C++笔记 55条编程法则

    1.  视C++为一个语言联邦 C++高效编程守则视状况而变化,取决于你使用C++的哪一部分. 2.  尽量以const,enum.inline替代#define 1) 对于单纯常量,最好以const ...

随机推荐

  1. delphi使用 第三方控件

    第三方控件安装时必须把所有的pas,dcu,dpk,res等文件复制到你的Lib目录下 然后通过dpk进行安装 安装后会多出来新的控件面板,新控件就在那里了 当然也有一些控件会安装到原有的面板上 比如 ...

  2. js快速打印一个五分制(五颗星)的评分情况

    1.函数 下面这个函数实现了在html页面中快速打印一个五分制(五颗星)的评分情况: function getRating(rating) { if(rating > 5 || rating & ...

  3. bzoj1471

    转化补集的思想,首先求出任意两点之间路径数目 然后求两条路径第一次相交在点k(按照拓扑排序的顺序)的数目,显然这里要用到容斥 然后pascal有坑爹的范围检测,所以运算中有些不会影响到答案但会爆int ...

  4. UVA 753 A Plug for UNIX 电器插座(最大基数匹配,网络流)

    题意: 给n个插座,m个设备(肯定要插电了),k种转换头可无限次使用(注意是单向的),问有多少设备最终是不能够插上插座的? 分析: 看起来就是设备匹配插座,所以答案不超过m.这个题适合用网络流来解. ...

  5. Java [leetcode 23]Merge k Sorted Lists

    题目描述: Merge k sorted linked lists and return it as one sorted list. Analyze and describe its complex ...

  6. Google Maps API v2 Demo Tutorial

    申请API KEY https://code.google.com/apis/console/?noredirect 1. 创建项目,名称随意,只是为了区分 2. 开启Google Maps Andr ...

  7. MySQL table_id原理及风险分析

    1. 什么是table_id MySQL binlog文件按格式分为文件头部和事件信息.文件头部占4字节,内容固定为:"\xfe\x62\x69\x6e",接下来就是各个event ...

  8. Spring @Resource、@Autowired、@Qualifier的注解注入及区别

    spring2.5提供了基于注解(Annotation-based)的配置,我们可以通过注解的方式来完成注入依赖.在Java代码中可以使用 @Resource或者@Autowired注解方式来经行注入 ...

  9. VS2013 :IntelliSense: 不允许使用不完整的类型

    出现上述情况,一般是存在对应的头文件,但是没有引用造成的. 引用的时候要注意头文件的顺序, 本项目中的头文件一般先引入,也就是用双引号#include "xxx.h",然后是系统中 ...

  10. 工具http://www.architexa.com/learn-more/install使用

    准备写篇博客,用来研究开源软件的利器.