前言
当我们调用函数时,是有很多消耗的。其中最大的销毁就是为函数开辟空间 - 函数栈帧。
如果我们有一个函数,很短,而且要调用很多次,比如Swap()。它所造成消耗就比较大,那有没有一种方式来减少消耗?内联函数可以帮我们解决这个问题。
内联函数是在c++98引入,现在c语言的C99版本也引入了内联函数。
一、宏函数
其实在没有引入内联函数前,已经有一种方式可以解决这个问题了,即宏函数。
宏函数并非是一个函数,本质是一种替换
注意:宏函数的书写方式,这里不能将 ((x)+(y)) 写成 x+y
因为这会出现很多错误
- int c = Add(a,b) * 10 -> int c = a + b * 10 结果不正确
- int c = Add(a | b, a & b) -> int c = a | b + a & b +的优先级比|和&高,则计算顺序为 a | (b + a) & b
所以宏函数的括号不能随便删减,以防出现很多计算错误。
既然宏函数可以解决,那为什么还要引入内联函数呢?
因为宏函数无法调用,内联函数可以解决这个问题。
二、内联函数
以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
通过汇编代码可以看到它们的区别
但内联函数并不是我们想要就要的,inline关键字对编译器来说只是建议,而不是强制要求。
因为,通过上面的介绍,我们知道内联函数适合以下几种情况
- 函数体比较短,能在调用点展开且展开后代码不会过于冗长。
- 函数被频繁调用,以提高执行效率。
- 函数不使用递归、循环、switch 等流程控制语句。
如果你的函数体很长,调用频繁,使用了递归,那此时它如果作为内联函数,编译器拒绝你的建议。
.
三、内联函数的易错点
别让内联函数的声明和定义分离
c和c++需要经过以下过程才能生成可执行程序。
具体过程如下:
而内联函数是不会进入符号表的,因为它不需要去链接,它是直接展开在调用的地方。
如果你将内联函数的声明和定义放在了不同的文件中,则会出现链接错误。