本文为senlie原创。转载请保留此地址:http://blog.csdn.net/zhengsenlie

Item 44 46





1.将大多数 inlining 限制在小型、被频繁调用的函数身上。这可使日后的调试过程和二进制升级更easy,

也可使潜在的代码膨胀问题最小化,使程序的速度提升机会最大化。





2.inline是对编译器的一个申请。

隐喻方式:将函数定义于 class 定义式内, 如成员函数或 friend 函数

明白声明:在定义式前加keyword inline

编译器会拒绝大过复杂的函数 inlining, 而全部对 virtual 函数的调用也都会使 inlining 落空。

由于 virtual 意味 ”等待。直到执行期才确定调用哪个函数“, 而 inline 意味”执行前,先将调用动作替换为被调用函数的本体“。

3.尽管编译器有意愿 inlining 某个函数。还是可能为该函数生成一个 outlined 函数本体。

正常调用能够inlined, 通过函数指针的调用也许不被 inlined

inline void f() {...} //如果编译器有意愿 inline "对f的调用"
void (*pf)() = f; //pf指向 f
//...
f(); //这个调用将被 inlined,由于它是一个正常调用。 pf();//这个调用也许不被 inlined,由于它通过函数指针达成。

4.不要仅仅由于 function templates 出现的头文件,就将它们声明为 inline

Inline 函数通常一定被置于头文件内,由于大多数建置环境在编译过程中进行inlining,而为了将一个“函数调用”

替换为“被调用函数函数的本体”。嘎嘎必须知道那个函数长什么样子。

Templates 通常也被置于头文件内,由于它一旦被使用,编译器为了将它详细化。须要知道它长什么样子。

但 Template 的详细化与 inlining无关。不要仅仅由于 function templates 出现的头文件,就将它们声明为 inline。





5.inline函数f:一旦改变f,全部用到f的client面程序都必须又一次编译

non-inline函数:一旦改变f,client仅仅需又一次连接。

Effective C++ Item 30 inline里里外外的更多相关文章

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

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

  2. Effective JavaScript Item 30 理解prototype, getPrototypeOf和__proto__的不同

    本系列作为Effective JavaScript的读书笔记. prototype,getPropertyOf和__proto__是三个用来訪问prototype的方法.它们的命名方式非常类似因此非常 ...

  3. Effective STL 学习笔记 Item 30: 保证目标区间足够大

    Effective STL 学习笔记 Item 30: 保证目标区间足够大 */--> div.org-src-container { font-size: 85%; font-family: ...

  4. effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  5. 读书笔记 effective c++ Item 34 区分接口继承和实现继承

    看上去最为简单的(public)继承的概念由两个单独部分组成:函数接口的继承和函数模板继承.这两种继承之间的区别同本书介绍部分讨论的函数声明和函数定义之间的区别完全对应. 1. 类函数的三种实现 作为 ...

  6. 读书笔记 effective c++ Item 44 将与模板参数无关的代码抽离出来

    1. 使用模板可能导致代码膨胀 使用模板是节省时间和避免代码重用的很好的方法.你不需要手动输入20个相同的类名,每个类有15个成员函数,相反,你只需要输入一个类模板,然后让编译器来为你实例化20个特定 ...

  7. 读书笔记 effective c++ Item 46 如果想进行类型转换,在模板内部定义非成员函数

    1. 问题的引入——将operator*模板化 Item 24中解释了为什么对于所有参数的隐式类型转换,只有非成员函数是合格的,并且使用了一个为Rational 类创建的operator*函数作为实例 ...

  8. 读书笔记 effective C++ Item 33 避免隐藏继承而来的名字

    1. 普通作用域中的隐藏 名字实际上和继承没有关系.有关系的是作用域.我们都知道像下面的代码: int x; // global variable void someFunc() { double x ...

  9. 读书笔记 effective c++ Item 22 将数据成员声明成private

    我们首先看一下为什么数据成员不应该是public的,然后我们将会看到应用在public数据成员上的论证同样适用于protected成员.最后够得出结论:数据成员应该是private的. 1. 为什么数 ...

随机推荐

  1. textarea统计字数

    开发项目中经常会用到,textarea统计字数 源码如下: <!DOCTYPE html><html lang="en"><head> < ...

  2. CF451E Devu and Flowers (组合数学+容斥)

    题目大意:给你$n$个箱子,每个箱子里有$a_{i}$个花,你最多取$s$个花,求所有取花的方案,$n<=20$,$s<=1e14$,$a_{i}<=1e12$ 容斥入门题目 把取花 ...

  3. C语言中头文件尖括号和引号的区别

    用include 引用头文件时,双引号和尖括号的区别: 1.双引号:引用非标准库的头文件,编译器首先在程序源文件所在目录查找,如果未找到,则去系统默认目录查找,通常用于引用用户自定义的头文件. 2.尖 ...

  4. 编写使用systemctl启动服务脚本

    CentOS 7的服务systemctl脚本存放在:/usr/lib/systemd/,有系统(system)和用户(user)之分,像需要开机不登陆就能运行的程序,还是存在系统服务里吧,即:/usr ...

  5. 【转】Hook钩子C#实例

    [转]Hook钩子C#实例 转过来的文章,出处已经不知道了,但只这篇步骤比较清晰,就贴出来了. 一.写在最前 本文的内容只想以最通俗的语言说明钩子的使用方法,具体到钩子的详细介绍可以参照下面的网址: ...

  6. XML快速注释

    eclipse中编辑java或C/C++,python文件时,注释的快捷键均为 "CTRL + / ",编辑xml文件时,该快捷键无效. eclipse XML 注释:CTRL + ...

  7. 11g v$wait_chains 与 hanganalyze

    11g之后,通过v$wait_chains视图诊断数据库hang和Contention   11g之前,通常我们数据库hang住了之后,我们会对数据库做hang analyze来进行分析,在11g之后 ...

  8. IP address could not be resolved: Temporary failure in name resolution

    今早发现mysql日志中有非常多例如以下的警告: 140724 18:41:25 [Warning] IP address '172.16.18.217' could not be resolved: ...

  9. Word histogram

    Here is a program that reads a file and builds a histogram of the words in the file: process_file lo ...

  10. 《剑指offer》树的子结构

    一.题目描述 输入两颗二叉树A,B,判断B是不是A的子结构. 二.输入描述 输入两棵树A,B. 三.输出描述 判断B是不是A的子结构,是返回true,否则返回false. 四.牛客网提供的框架 /* ...