inline内联函数学习随笔

 1,什么是内联函数?

Inline修饰的成员函数称为内联函数

什么样的成员函数可以声明为inline呢?

  1. 短小
  2. 逻辑简单
  3. 频繁调用

原因:函数调用需要进栈出栈,进栈和出栈都需要开销,所以如果是内联函数就在编译阶段直接将函数的实现就展开了

这里插入一道曾遇到过的单选题

(单选)下面关于inline说法正确的时是:

A:关键字inline是强制行为

B:关键字inline只是一种编译器建议

C:inline在运行时生效

D:inline不能避免函数调用时参数传递带来的栈开销

答案选B

函数执行前有准备工作,要将实参、局部变量、返回地址以及寄存器存入栈中,然后执行函数体的代码;执行完函数体的代码后,要清理现场,把栈中的数据出栈,然后再执行该函数后面位置的代码。

 上述中压栈、出栈是消耗时间和空间的,当然了,执行函数体的代码也是要时间的。

 如果函数体代码执行时间短,那么调用函数时,压栈、出栈的比重就会上升,建议将函数定义为内联函数,那么这个函数的源码会在编译阶段就嵌入该位置,而不用去调用函数,执行压栈、出栈操作了。
类似于宏定义的展开。

A.没有强制,和B是矛盾关系
B.的确只是建议
C.可以避免栈开销,inline函数直接把函数体代码嵌入到该函数位置
D.在编译时就生效了

注意:只是对编译器的建议

思考:想想我们之前学过的宏函数是怎么样的?

  1. 短小
  2. 逻辑简单
  3. 编译时直接替换

思考:为什么有了宏函数还需要内联函数呢?

宏函数的本质是宏,所以只是文本替换,形参需要加括号,形参类型默认是文本

内联函数本质是函数,形参不需要加括号,形参类型可以自己任意指定

2,内联函数的缺点

使用内联函数的缺点也是非常明显的,编译后的程序会存在多份相同的函数拷贝,如果被声明为内联函数的函数体非常大,那么编译后的程序体积也将会变得很大,所以再次强调,一般只将那些短小的、频繁调用的函数声明为内联函数。

3,什么时候使用  


内联能提高函数的执行效率,那么为什么不把所有的函数都定义成内联函数呢?因为它以代码膨胀(拷贝)为代价,仅仅省区了函数调用的开销,从而提高程序的执行效率。(开销指的是参数的压栈、跳转、退栈和返回操作)。一方面,如果执行函数体内代码的时间比函数调用的开销大得多,那么inline效率收益会很小。另一方面,每一处内联函数的调用都要拷贝代码,使程序的总代码量增大,消耗更多的内存空间。
以下情况不宜使用内联:如果函数体内代码比较长,使用内联将导致可执行代码膨胀过大。
如果函数体内出现循环或者其他复杂的控制结构,那么执行函数体内代码的时间将比函数调用的开销大得多。
 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值