inline可以带来各种好处:

首先其可以使得消除函数调用带来的开销,再者编译器对这种非函数的代码可以做出更多的优化策略。
 
但是inline函数首先肯定是会导致程序代码的大小更加的庞大,这样会带来代码膨胀,造成的损害首先就是会导致计算机额外的换页行为,降低指令告诉缓存的集中率,这要就会带来效率上的损失。
 
所以说,使用inline的关键点就在于,如果inline函数的本体很小的话,那么inline函数展开的代码大小可能比调用非inline函数展开的代码更小,这样就可以提高缓存的击中率,从而提高函数的效率。
 
在看看inline函数的使用,隐式的inline函数实际上就是那些在类中声明并在类中定义的函数,而显式的就是以inline标出来的函数。
 
标准库中的template::max实际上就是一个inline函数,但是并非所有的template版本的函数都是inline函数。 如果声明某个模板的时候认为其所有的具体化都应该是模板,那么就应该将模板声明成为inline的形式。
 
inline函数一般都是咋编译期就决定了的这也就意味着virtual函数往往都不能是inline的,应为virtual函数往往都牵涉到运时期。
 
注意,inline有时候也不是一定能达成的,比如说下面这个例子:
 
 inline void f(){...}
void (*pf)() = f;
...
f();
pf();
那么实际上,上面的f()可能会被正确的inline,但是下面的pf并不一定,因为函数要提供地址给pf,那么一般是应该实现出inline函数的一个outline版本提供给函数指针的。
 
注意,对于构造函数以及析构函数使用inline函数往往是不明智的选择:
 class Base{
public:
private:
std::string;
};
class Derived : public Base{
public:
Derived(){}
...
private:
std::string dm1, dm2, dm3;
};
上面的derived class的构造函数看起来好像是没有做任何的动作,但是实际上这个构造函数有编译器施加了非常精细的代码。所以将构造函数以及析构函数生命成为inline甚至会带来非常恐怖的代码膨胀。
 
而且inline函数是无法链接的,这样当函数有改动的时候,会导致整个模块的重新链接, 可能造成较为恐怖的开销。
 
所以说,书写inline函数最好的就是那些必须成为inline函数的函数,或者那些较为短小十分简单的函数。
 
小结:
1.将inline函数施加在小型的,被频繁调用的函数上面
2.不要因为function template 出现在头文件中,就把他们声明称inline的

条款30:透彻了解inline的里里外外。的更多相关文章

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

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

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

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

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

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

  4. 【30】透彻了解inlining 的里里外外

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

  5. 读书笔记_Effective_C++_条款三十:了解inline的里里外外

    学过基本程序课的同学都知道,inline是内联的关键字,它可以建议编译器将函数的每一个调用都用函数本体替换.这是一种以空间换时间的做法.把每一次调用都用本体替换,无疑会使代码膨胀,但可以节省函数调用的 ...

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

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

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

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

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

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

  9. Effective C++ 5.实现

    //条款26:尽量延后变量的定义式出现的时间 // 1.不仅应该延后变量的定义,更应该直到使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始值为止.如果这样,不仅能够避免构造和析构的非必 ...

随机推荐

  1. mysql 建立表之间关系 练习 1

    练习:账号信息表,用户组,主机表,主机组 #用户表 mysql> create table user( id int not null unique auto_increment, userna ...

  2. Angular路由参数传递

    一.路由时传递参数的方式 1.在查询参数中传递数据 //页面 <a routerLink="/product" [queryParams]="{id:1}" ...

  3. python爬取当当网的书籍信息并保存到csv文件

    python爬取当当网的书籍信息并保存到csv文件 依赖的库: requests #用来获取页面内容 BeautifulSoup #opython3不能安装BeautifulSoup,但可以安装Bea ...

  4. numpy.linspace介绍

    numpy.linspace:在指定范围内返回均匀间隔的数组 In [12]: import numpy as np In [13]: result = np.linspace(1,10) #默认生成 ...

  5. (转)牛B的代码不一定是好代码

    最近经常做业务逻辑代码review的工作,发现各种风格的代码,其中有一种是封装和抽象做的非常的多,代码层次非常的深入,表面给人感觉是:牛逼的代码. 但是从清晰度和可维护性来说,还是不推荐这么做. 1. ...

  6. C# 复杂算法

    1.添加命名空间引用using Microsoft.JScript; //formula 是公式如:(1+2)*3/10 private double GetComputeValueByStringF ...

  7. Java Web专题

  8. 对 Java Integer.valueOf() 的一些了解

    从一道选择题开始 分析 选项A   选项A中比较的是i01和i02,Integer i01=59这里涉及到自动装箱过程,59是整型常量,经包装使其产生一个引用并存在栈中指向这个整型常量所占的内存,这时 ...

  9. thinkphp api架构搭建

    1.结构搭建 模块下面使用 controller , model ,service,validate分别对应的作用 controller控制器里面可以进行分版本 v1,v2之类的,不过要访问通必须配置 ...

  10. Mybatis配置插入数据返回主键ID

    需要在insert方法中添加 <insert id="insertSelective" parameterType="com.midou.ott.model.MDA ...