【C++】详细解释内联函数的用法和问题

1、内联函数

1.1 什么是内联函数

概念
  用inline修饰的函数叫做内联函数,内联函数在编译的时候C++编译器会在调用的地方展开,没有函数调用建立栈帧的开销,使得程序运行效率提升。


未修饰内联的函数,调用函数后call func函数地址,并且建立函数栈帧,函数体不展开。
在这里插入图片描述

修饰内联的函数,调用函数后没有call func函数地址,不建立函数栈帧,函数体展开。
在这里插入图片描述

内联函数是C语言宏函数的改进
在C语言宏函数中,虽然能够增强代码的复用性、提高性能,但是它的缺点更为显著:

  1. 不方便调试(预处理直接替换)
  2. 没有类型安全的检查
  3. 代码的可读性差,容易出错

内联函数的出现,能很好解决这些问题。

1.2 内联函数的特性

  内联函数是一种以空间换时间的做法,通过将函数体展开,使得函数方便调试、能够有类型的检查、程序格式更加合适,但内联函数的缺点有什么呢?

其实内联函数的修饰 inline 在对于编译器而言只是一个建议,不同编译器关于inline有着自己的判断标准,一般函数规模较小,不是递归且调用频繁的函数才会采用inline修饰。

为什么要加以限制呢?
如果多次调用一个内联函数,并且函数比较长或者有一个很深的递归实现,那么在调用展开后代码将会变得非常长,容易造成代码膨胀
比如:
在这里插入图片描述
内容膨胀造成可执行程序(.exe)的文件大小变大,软件安装包也就变大了,用户下载就得吃力。

所以编译器会自行判断展开,并且内联函数展开后得规模小。

1.3 内联函数的声明和定义应该在同一文件

inline不建议声明和定义分离,分离会导致链接错误。
如果对编译链接不太熟可以看看程序的编译和链接


一个正常链接过程
在这里插入图片描述
在这里插入图片描述
这样就可以正常的运行一个程序。

加入inline声明的链接过程

在这里插入图片描述
如果函数声明和定义在一个文件,就不需要链接,所以内联函数的声明和定义应该放在一个文件中。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值