此篇文章中,船长计划用理论和代码相结合的方式向大家介绍C++的入门知识;
全文干货,C++系列文章,兄弟们继续冲!
目录
7.内联函数
7.1内联函数的概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调
用建立栈帧的开销,内联函数提升程序运行的效率。
上面书写的代码使用了函数的调用,如果在上述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
通过对比汇编代码,我们可以很清晰的发现两段代码实现方式的不同。
7.2内联函数的特性
1、空间换时间
inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会
用函数体替换函数调用。
- 缺陷:可能会使目标文件变大;
- 优势:少了调用开销,提高程序运行效率。
2、仅为建议
inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建
议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不
是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。
- 简单来说,内联机制多用于优化规模较小、流程简单且频繁调用的函数,在很多情况下编译器不一定会支持这个请求(假如你有一个75行代码的函数,使用内联是很难成功的~)
正如《C++prime》第五版关于inline的内容所描述的那样:
这时我们很多朋友就会问了:为什么代码长了就不展开了呢?
其实原因就在于 —— 代码膨胀
我们都知道,一个企业级项目的代码量是非常庞大的,假设我们有一个30行代码的函数,在项目中有10000个地方需要使用,两种不同的方法会有什么区别呢?
- 如果使用inline内联的话,函数展开后我们的项目会多出令人惊叹的30万行代码之多,而且代码重复率很高。
- 但是如果我们使用函数调用的话,我们只需要将这30行代码调用10000次就够了,虽然耗费的时间多了,但是所需空间却可以有明显的减少(现代计算机的运行速度是非常快的,权衡利弊之后,人们更愿意用时间来换取空间使用量的减小)。