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. MVC三层架构搭建

    MVC三层架构搭建 项目主要是用三层来搭建项目,三层分为表现层,数据层和业务层.项目用了目前比较流行的IOC架构.目前流行的IoC 框架有AutoFac,Unity,Spring.NET等,项目中选用 ...

  2. JMeter性能测试入门--简单使用

    1.JMeter整体简介 Apache JMeter是Apache组织开发的基于Java的压力测试工具.用于对软件做压力测试,它最初被设计用于Web应用测试,但后来扩展到其他测试领域. 它可以用于测试 ...

  3. 开发技术--浅谈python数据类型

    开发|浅谈python数据类型 在回顾Python基础的时候,遇到最大的问题就是内容很多,而我的目的是回顾自己之前学习的内容,进行相应的总结,所以我就不玩基础了,很多在我实际生活中使用的东西,我会在文 ...

  4. linux桌面系统的约定

    linux系统的桌面系统基本遵循同样的约定. mime类型 在linux下,关于文件类型的信息通常放在/usr/share/mime./usr/local/share/mime和用户目录下,所有应用程 ...

  5. 【原】通过Spring结合Cglib处理非接口代理

    前言: 之前做的一个项目,虽然是查询ES,但内部有大量的逻辑计算,非常耗时,而且经常收到JVM峰值告警邮件.分析了一下基础数据每天凌晨更新一次,但查询和计算其实在第一次之后就可以写入缓存,这样后面直接 ...

  6. springboot使用vue打包过的页面资源

    (一)webpack打包 如果在vue基于webpack的,build打包后得到的是如下的资源文件: webstorm中提示如下: 这个大致的意思就是这边的文件需要放在http服务器上访问,如果直接打 ...

  7. Git的认识与使用

    Git教程 https://www.liaoxuefeng.com/wiki/896043488029600/897271968352576 Git与SVN区别 Git 不仅仅是个版本控制系统,它也是 ...

  8. [PHP] 使用ftell和fseek函数直接定位文件位置获取部分数据

    对于大文件只获取部分数据很有用 1.使用ftell函数可以获取当前指针的字节位置2.使用fseek函数可以直接定位到指定的位置3.读取指定字节的数据就可以部分获取文件内容了 <?php clas ...

  9. linux设备驱动程序-设备树(1)-dtb转换成device_node

    linux设备驱动程序-设备树(1)-dtb转换成device_node 本设备树解析基于arm平台 从start_kernel开始 linux最底层的初始化部分在HEAD.s中,这是汇编代码,我们暂 ...

  10. python简单日志处理

    简单日志处理 import datetime import re logfile='''58.61.164.141 - - [22/Feb/2010:09:51:46 +0800] "GET ...