大家好,我是苏貝,本篇博客带大家了解C++的内联函数,如果你觉得我写的还不错的话,可以给我一个赞👍吗,感谢❤️
目录
- 一. 宏函数
- 二. 内联函数
- 1 概念
- 2 特性
一. 宏函数
在C语言中,如果我们要频繁地调用某个函数10万次,那就要建立10万个栈帧再销毁10万个栈帧,这就太影响效率了。那C语言是怎么解决这一个问题的?用宏函数,它只是替换,不需要建立栈帧
宏函数怎么实现呢?下面这些吗
这些都是错的,原因:
- 宏函数不是函数,它只是替换,所以不需要写参数的类型和return
- 宏函数是替换,所以不需要分号
- 注意括号控制优先级
核心点:宏是预处理阶段进行替换
因此,宏函数的正确写法:
为什么a和b还要单独加括号?因为它们可能是表达式,如a为x|y,b为x&y。
宏的缺点:
- 语法复杂,坑很多
- 不能调试
- 没有类型安全的检查,比如要传int类型的参数,结果传double类型
二. 内联函数
宏函数是C语言解决频繁调用函数导致为某个函数多次建立栈帧的方法,C++则是用内联函数解决
1 概念
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,可提升程序运行的效率。
如果在下述函数前增加inline关键字将其改成内联函数,在编译期间编译器会用函数体替换函数的调用。
查看inline后汇编代码的方法:
- 在release模式下,查看编译器生成的汇编代码中是否存在call Add
- 在debug模式下,需要对编译器进行设置,否则不会展开(因为debug模式下,编译器默认不会对代码进行优化,以下给出vs2013的设置方式)
2 特性
-
inline是一种以空间换时间的做法,如果编译器将函数当成内联函数处理,在编译阶段,会用函数体替换函数调用,缺陷:可能会使生成的可执行文件变大,优势:少了调用开销,提高程序运行效率。
-
inline对于编译器而言只是一个建议,不同编译器关于inline实现机制可能不同,一般建 议:将函数规模较小(即函数不是很长,具体没有准确的说法,取决于编译器内部实现)、不是递归、且频繁调用的函数采用inline修饰,否则编译器会忽略inline特性。下图为 《C++prime》第五版关于inline的建议:
-
inline不建议声明和定义分离,分离会导致链接错误。因为inline被展开,就没有函数地址了,链接就会找不到。
好了,那么本篇博客就到此结束了,如果你觉得本篇博客对你有些帮助,可以给个大大的赞👍吗,感谢看到这里,我们下篇博客见❤️