【C++】6. 内联函数

内联函数和宏函数都是为了解决函数调用开销问题,宏函数通过预处理进行文本替换,可能产生计算错误。内联函数在C++98引入,C99也支持,能避免函数调用的栈帧创建,提高效率,但编译器可根据情况决定是否内联。内联函数不适合长函数、递归或有复杂控制流的情况。注意内联函数的声明和定义需在同一作用域,否则可能导致链接错误。
摘要由CSDN通过智能技术生成


前言

当我们调用函数时,是有很多消耗的。其中最大的销毁就是为函数开辟空间 - 函数栈帧。
如果我们有一个函数,很短,而且要调用很多次,比如Swap()。它所造成消耗就比较大,那有没有一种方式来减少消耗?内联函数可以帮我们解决这个问题。

内联函数是在c++98引入,现在c语言的C99版本也引入了内联函数。


一、宏函数

其实在没有引入内联函数前,已经有一种方式可以解决这个问题了,即宏函数。

宏函数并非是一个函数,本质是一种替换

在这里插入图片描述

注意:宏函数的书写方式,这里不能将 ((x)+(y)) 写成 x+y
因为这会出现很多错误

  1. int c = Add(a,b) * 10 -> int c = a + b * 10 结果不正确
  2. int c = Add(a | b, a & b) -> int c = a | b + a & b +的优先级比|和&高,则计算顺序为 a | (b + a) & b

所以宏函数的括号不能随便删减,以防出现很多计算错误。


既然宏函数可以解决,那为什么还要引入内联函数呢?
因为宏函数无法调用,内联函数可以解决这个问题。


二、内联函数

以inline修饰的函数叫做内联函数,编译时C++编译器会在调用内联函数的地方展开,没有函数调用建立栈帧的开销,内联函数提升程序运行的效率。
在这里插入图片描述

在这里插入图片描述
通过汇编代码可以看到它们的区别
在这里插入图片描述


但内联函数并不是我们想要就要的,inline关键字对编译器来说只是建议,而不是强制要求。
因为,通过上面的介绍,我们知道内联函数适合以下几种情况

  1. 函数体比较短,能在调用点展开且展开后代码不会过于冗长。
  2. 函数被频繁调用,以提高执行效率。
  3. 函数不使用递归、循环、switch 等流程控制语句。

如果你的函数体很长,调用频繁,使用了递归,那此时它如果作为内联函数,编译器拒绝你的建议。
.
在这里插入图片描述


三、内联函数的易错点

别让内联函数的声明和定义分离

c和c++需要经过以下过程才能生成可执行程序。
在这里插入图片描述
具体过程如下:
在这里插入图片描述
而内联函数是不会进入符号表的,因为它不需要去链接,它是直接展开在调用的地方。
如果你将内联函数的声明和定义放在了不同的文件中,则会出现链接错误。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值