Agenda:

  • 为什么要用inline
  • inline使用时机

为什么要用inline

考虑下列min()函数(例子来自C++Primer第三版303页)

int min( int v1, int v2 )
{  return( v1 < v2 << v1 : v2 );
}  

为这样的小操作定义一个函数的好处是:

  • 如果一段代码包含min()的调用,那阅读这样的代码并解释其含义比读一个条件操作符的实例,可读性会强很多。
  • 改变一个局部化的实现比更改一个应用中的300个出现要容易得多
  • 语义是统一的,每个测试都能保证相同的方式实现
  • 函数可以被重用,不必为其他的应用重写代码

不过,将min()写成函数有一个严重的缺点:调用函数比直接计算条件操作符要慢很多。那怎么能兼顾以上优点和效率呢?C++提供的解决方案为inline(内联)函数

在程序编译时,编译器将程序中出现的内联函数的调用表达式用内联函数的函数体来进行替代

例如,如果一个函数被指定为inline 函数则它将在程序中每个调用点上被内联地展开例如

int minVal2 = min( i, j );  

在编译时被展开为

int minVal2 = i < j << i : j;  

则把min()写成函数的额外执行开销从而被消除了。

inline使用时机

从inline的原理,我们可以看出,inline的原理,是用空间换取时间的做法,是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。

如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。所以,如果函数体代码过长或者函数体重有循环语句,if语句或switch语句或递归时,不宜用内联

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline 放在函数声明前面不起任何作用。内联函数调用前必须声明。《高质量C/C++编程》里一个例子。

inline void Foo(int x, int y); // inline 仅与函数声明放在一起
void Foo(int x, int y)
{  ...
}  

以上代码不能成为内联函数,而以下则可以

void Foo(int x, int y);
inline void Foo(int x, int y) // inline 与函数定义体放在一起
{  ...
}  

所以说,inline 是一种“用于实现的关键字”,而不是一种“用于声明的关键字”。对于以上例子,林锐还建议,只在定义前加上inline,而不是在声明和定义前都加,因为这能体现高质量C++/C 程序设计风格的一个基本原则:声明与定义不可混为一谈。

inline对于编译器来说只是一个建议,编译器可以选择忽略该建议。换句话说,哪怕真的写成了inline,也没有任何错误的情况下,编译器会自动进行优化。所以当inline中出现了递归,循环,或过多代码时,编译器自动无视inline声明,同样作为普通函数调用。

Tip: 只有当函数只有 10 行甚至更少时才将其定义为内联函数.

缺点: 滥用内联将导致程序变慢. 内联可能使目标代码量或增或减, 这取决于内联函数的大小. 内联非常短小的存取函数通常会减少代码大小, 但内联一个相当大的函数将戏剧性的增加代码大小. 现代处理器由于更好的利用了指令缓存, 小巧的代码往往执行更快。

另一个实用的经验准则: 内联那些包含循环或 switch 语句的函数常常是得不偿失 (除非在大多数情况下, 这些循环或 switch 语句从不被执行)。

有些函数即使声明为内联的也不一定会被编译器内联, 这点很重要; 比如虚函数和递归函数就不会被正常内联. 通常, 递归函数不应该声明成内联函数.(递归调用堆栈的展开并不像循环那么简单, 比如递归层数在编译时可能是未知的, 大多数编译器都不支持内联递归函数). 虚函数内联的主要原因则是想把它的函数体放在类定义内, 为了图个方便, 抑或是当作文档描述其行为, 比如精短的存取函数。

内联函数可以理解为C++中对于函数专有的宏,对于C的函数宏的一种改进。对于常量宏,C++提供const替代;而对于函数宏,C++提供的方案则是inline。在C中,大家都知道宏的优势,编译器通过复制宏代码的方式,省去了参数压栈,生成汇编的call调用,返回参数等操作,虽然存在一些安全隐患,但在效率上,还是很可取的。

C++11中内联函数(inline)相关推荐

  1. c语言什么是内联函数,C语言中内联函数inline的使用方法

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 来源一:比特网 来源二:东方锐智 在C++中,为了解决一些频繁调用的小涵数大量消耗栈空间或者是叫栈内存的问题,特别的引入了inline修饰符,表示为内联涵 ...

  2. C++中的内联函数inline

    1.Cpp中的内联函数 内联函数是通常与类一起使用.如果一个函数是内联的,那么在编译时,编译器会把该函数的代码副本放置在每个调用该函数的地方.对内联函数进行任何修改,都需要重新编译函数的所有客户端,因 ...

  3. C语言中内联函数的作用 inline

    C语言中内联函数的作用 inline C语言中内联函数到底有什么作用? 试想一下,每当我们在假设就在主函数中调用另外一个函数的时候,那么这个函数就要入栈或者出栈,比如说下面的一个例子: 点击(此处)折 ...

  4. C++中的内联函数inline总结

    C++中的内联函数inline总结 标签: c++编译器vector编程汇编windows 2011-08-26 21:46 13982人阅读 评论(8) 收藏 举报 分类: c/c++进行时(28) ...

  5. ios内联函数 inline

    ios内联函数 inline 缘由 由于在学习使用UIScrollVew开发的过程中,碰到下面这个属性(设置内边距): @property(nonatomic) UIEdgeInsets scroll ...

  6. [C++] 内联函数inline 以及 auto关键字 -- C++入门(4)

    本篇文章主要包括内联函数和auto关键字.其中,内敛函数包括概念,特性等:auto关键字的使用规则,使用场景等. 目录 1.内敛函数 1.1问题引入: 1.2内联函数的概念 1.3内敛函数的特性 2. ...

  7. 内联函数inline

    结论在文章末尾处! 在C++中,为了解决一些频繁调用的小函数大量消耗栈空间(栈内存)的问题,特别的引入了inline修饰符,表示为内联函数. 内联函数的处理方式是在函数的调用点直接代码展开.在计算机系 ...

  8. C++内联函数(inline function)

    c++从c中继承的一个重要特征就是效率.假如c++的效率明显低于c的效率,那么就会有很大的一批程序员不去使用c++了. 在c中我们经常把一些短并且执行频繁的计算写成宏,而不是函数,这样做的理由是为了执 ...

  9. 内联函数(Inline Function )

    目录 什么是内联函数(Inline Function) 如何将函数编写为内联函数(how to make function inline) 例: 为什么使用内联函数(Why to use inline ...

  10. inline函数返回值_C++ 内联函数 inline的详细分析

    1. 什么是内联函数?   就是使用了关键字inline的函数,如 inline int max(int a, int b){ 2. 内联函数有什么作用?   C++在调用函数时,会执行一系列的操作: ...

最新文章

  1. PHP经典乱码“口”字与解决办法
  2. 【Android 高性能音频】Oboe 音频流打开后 耳机 / 音箱 插拔事件处理 ( 设置 Oboe 音频设备 ID | setDeviceId 函数原型 | AudioStream 音频流 )
  3. AntData.ORM框架 之 读写分离
  4. git提交代码到github时出现everything up-to-date,但是代码没有上传成功
  5. 数据可视化组队学习:《Task06 - 场景案例显神通》笔记
  6. [转载]出了国才明白的10件事~(MITBBS ZT)
  7. jQuery框架+DWR框架实现的Java Web中的Ajax效果(异步请求,局部刷新)
  8. 阿里千亿级购物节背后,淘宝智能客服架构演进之路
  9. STL 容器迭代器失效总结(超级详细)
  10. [转]Reporting Services 中的身份验证类型
  11. 运行JAR文件显示没有主清单属性
  12. INSAR学习(小白笔记一)
  13. MapABC Flex4 Demo
  14. 聚合搜索 Meta Search实践
  15. 【已解决】双显卡电脑开机启动慢的解决办法
  16. 【100%通过率】华为OD机试真题 Java 实现【预订酒店】【2022.11 Q4 新题】
  17. 为一个 iOS 应用编写一个简单的 Node.js/MongoDB Web 服务
  18. 【Git-2022总结】分布式代码版本控制工具【GitHub/Gitee/GitLab】
  19. 关于背单词的一点个人体会 (好文章)
  20. 超详细的热图绘制教程(5000余字),真正的保姆级教程

热门文章

  1. Scrypt哈希算法简介
  2. 解决npm安装时出现run `npm audit fix` to fix them, or `npm audit` for details
  3. 利用JAVA Service Wrapper把JAVA程序做成windows服务
  4. 吴恩达教授机器学习笔记【一】- 线性回归(2)
  5. 图像语义分割(9)-DeepLabV3: 再次思考用于图像语义分割的空洞卷积
  6. 统计一个数字在排序数组中出现的次数。
  7. leetcode之移除链表的元素
  8. iOS线程之——NSCondition
  9. learning-oracle-how2j
  10. 【3005】拦截导弹问题(noip1999)