前言
当我们调用函数时,是有很多消耗的。其中最大的销毁就是为函数开辟空间 - 函数栈帧。
如果我们有一个函数,很短,而且要调用很多次,比如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++需要经过以下过程才能生成可执行程序。

具体过程如下:

而内联函数是不会进入符号表的,因为它不需要去链接,它是直接展开在调用的地方。
如果你将内联函数的声明和定义放在了不同的文件中,则会出现链接错误。
优化代码:内联函数与宏函数的运用与比较
内联函数和宏函数都是为了解决函数调用开销问题,宏函数通过预处理进行文本替换,可能产生计算错误。内联函数在C++98引入,C99也支持,能避免函数调用的栈帧创建,提高效率,但编译器可根据情况决定是否内联。内联函数不适合长函数、递归或有复杂控制流的情况。注意内联函数的声明和定义需在同一作用域,否则可能导致链接错误。

1215

被折叠的 条评论
为什么被折叠?



