inline

inline是C++提供的一个关键字,它用于函数定义之前,表示把函数定义为内联函数。内联函数的含义是:在函数调用点把函数体直接展开,取代函数调用。

inline int getZero() {
return 0;
}
int a = getZero();

如果上述函数没有定义为inline,那么在声明a时,程序实际上的工作是,把getZero()函数压入栈中,执行函数得到返回值0并出栈,最后把0赋值给a。在定义为inline之后,编译器会把作为内联函数的函数体在调用点,也就是在声明a时展开,直接得到结果0并赋值给a,省去了函数入栈和出栈的调用过程,提升了性能。

那么如果是复杂一点的内联函数呢?

inline int get(int a, int b, int c, int x) {
return (a * x + b) * x +c;
}
int b = get(1, 2, 1, 4);

比起之前的getZero(),get()函数多了许多运算,它在调用点也会被展开为int b = (1 * 4 + 2) * 4 + 1;。可想而知,越复杂的函数体内联展开越困难。

由此也引出了内联函数定义的特点:

  • inline关键字对编译器起建议作用,是否内联编译由编译器决定。
  • inline关键字出现在函数声明处不起作用,出现在函数定义时有效。
  • 把逻辑复杂的函数定义为内联是无意义的,如嵌套调用、递归等。
  • 类内定义的函数都是隐式内联的,类外定义需要显式加上inline关键字。
// inline无意义
inline int f1(int x) {
if (x == 0 || x== 1) return 1;
return f(x - 1) + f(x - 2);
} // inline无意义
inline int f2(); class LiF {
public:
LiF() = default;
LiF(int _lif);
void set(int _lif) { lif = _lif; } // 类内隐式内联
int get();
private:
int lif;
} LiF::LiF(int _lif): lif(_lif) {} // 无内联 inline int LiF::get() { return lif; } // 类外显式内联

既然内联可以提高效率,那为什么不把所有函数都定义为内联呢?这个问题也不难解答。内联的前提是可以在调用点展开,显然之前提到的复杂函数时无法展开的;而如果某次内联函数执行消耗的时间远长于调用的消耗,那么这次内联也是失败的。再者,程序效率提升的背后必然有更大的内存消耗,内联带来的效率提升是通过复制代码到调用点实现的,这显然就增加了代码量。那么这就要求程序员谨慎地使用inline。

C++:inline的更多相关文章

  1. 重构改善既有代码设计--重构手法13:Inline Class (将类内联化)

    某个类没有做太多事情.将这个类的所有特性搬移到另一个类中,然后移除原类. 动机:Inline Class (将类内联化)正好于Extract Class (提炼类)相反.如果一个类不再承担足够责任.不 ...

  2. C/C++编程笔记:inline函数的总结!C/C++新手值得收藏!

    在c/c++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 栈空间就是指放置程序的局部数据(也就是函数内数据)的内存空间. 在系统下, ...

  3. display:inline、block、inline-block 的区别

    一.块级元素 与  行级元素 要理解display:inline.block.inline-block的区别,需要先了解HTML中的块级(block)元素和行级(inline)元素的特点,行内元素也叫 ...

  4. effective c++:inline函数,文件间编译依存关系

    inline函数 inline函数可以不受函数调用所带来的额外开销,编译器也会优化这些不含函数调用的代码,但是我们不能滥用Inline函数,如果程序中的每个函数都替换为inline函数那么生成的目标文 ...

  5. C++的优秀特性2:inline 函数

    (转载请注明原创于潘多拉盒子) Inline函数是C++的一个很小的特性,在不计较效率的情况下,这个特性似乎可有可无.然而,C++天生是为最为广泛的应用场景设计的,因此,总会有关于效率的问题.其实,除 ...

  6. c语言: inline(gcc)

    从汇编的角度看inline函数与非inline函数http://blog.csdn.net/cxmanzhao/article/details/6801786 强制内联和强制不内联http://blo ...

  7. css 小知识点:inline/inline-block/line-height

    inline: 此元素会被显示为内联元素,元素前后没有换行符.因此:无法设置宽度和高度- inline-block: 行内块元素.元素前后没有换行符(CSS2.1 新增的值) 用通俗的话讲,就是不独占 ...

  8. 重构改善既有代码设计--重构手法02:Inline Method (内联函数)& 03: Inline Temp(内联临时变量)

    Inline Method (内联函数) 一个函数调用的本体与名称同样清楚易懂.在函数调用点插入函数体,然后移除该函数. int GetRating() { return MoreThanfiveLa ...

  9. CPP-基础:inline

    背景: 在C&C++中 一.inline关键字用来定义一个类的内联函数,引入它的主要原因是用它替代C中表达式形式的宏定义. 表达式形式的宏定义一例: #define ExpressionNam ...

随机推荐

  1. 简单的python GUI例子

    写一个简单的界面很容易,即使是什么都不了解的情况下,这个文本转载了最简单的界面编写,下个文本介绍了TK的简单但具体的应用 在python中创建一个窗口,然后显示出来. from Tkinter imp ...

  2. SVN每日定时备份脚本

    SVN每日定时备份脚本: @ECHO off REM SVN安装目录 SET SVN_HOME="D:\Program Files\VisualSVNServer" REM 版本库 ...

  3. Java实现QQ邮件发送

    首先我们需要两个jar包,点击下面即可下载这两个包: JavaMail mail.jar 1.4.5 JAF(版本 1.1.1) activation.jar 我们这里采用QQ邮箱发送邮件为例,代码如 ...

  4. 在vue里使用codemirror的两种用法

    这是我自己做的一个左边点击对应的标题,右边显示相应代码的一个功能.代码显示这里用的是vue-codemirror插件. 第一种用法: 1.安装:npm install vue-codemirror - ...

  5. X264-编码模块和NAL打包输出

    在上一篇介绍了编码器的VCL编码操作,分析了函数x264_slice_write().函数x264_slice_write()里有四个关键模块,分别是宏块分析模块.宏块编码模块.熵编码模块和滤波模块, ...

  6. tcpdump 介绍

    tcpdump 是一款强大的网络抓包工具,dump the traffice on anetwork,对网络上的数据包进行截获的包分析工具.熟练掌握 tcpdump 可以方便我们跟踪解决网络丢包,重传 ...

  7. MAC盗版软件下载网站黑名单

    上面有大量的开源软件或者免费软件,拒绝盗版从我做起, 下面被删除的网站提供大量破解软件下载,欢迎大家监督它们. 玩转苹果:http://www.ifunmac.com Mac软件下载站:http:// ...

  8. Java8——Optional

    /* * 一.Optional 容器类:用于尽量避免空指针异常 * Optional.of(T t) : 创建一个 Optional 实例 * Optional.empty() : 创建一个空的 Op ...

  9. InfoQ一波文章:AdaSearch/JAX/TF_Serving/leon.bottou.org/Neural_ODE/NeurIPS_2018最佳论文

    和 Nested Partition 有相通之处? 伯克利提出 AdaSearch:一种用于自适应搜索的逐步消除方法 在机器学习领域的诸多任务当中,我们通常希望能够立足预先给定的固定数据集找出问题的答 ...

  10. JDOJ3008 圆盘染色

    JDOJ3008 圆盘染色 https://neooj.com/oldoj/problem.php?id=3008 题目描述 将一个圆盘分为N (1 <= N <= 105)个扇形,每个扇 ...