C++ | 内敛函数 | 内敛函数的性质 | 内敛函数的特点 | 内联函数和普通函数的区别

目录

一.什么是内联函数

二.内联函数和宏的区别

三.内联函数和static修饰的函数的区别

四.使用inline的时机

五.内敛函数的缺点

六.使用内联函数时需要注意的事项


一.什么是内联函数

例如现在有如下一个函数

int sum(int x,int y)
{    
    return x+y;
}

虽然这个函数只有短短的三行,但当调用它时,会进行参数压栈,函数栈帧的开辟和回退过程,这会给系统带来很大的开销。因此我们可以使用内联函数。

inline int sum(int x,int y)
{    
    return x+y;
}

所谓的内联函数指的是,在函数的调用点直接把函数的代码展开,并且这一过程中没有其他符号产生,从而提升了整个程序的运行效率。而这一过程是在编译间段进行的。

还需特别注意的是,不是所有被inline修饰的函数都会被编译器当做内联函数来处理,例如递归。

二.内联函数和宏的区别

1.内联函数

  • 处理时机:编译间段。
  • 作用:进行代码展开,有安全检查和类型检查,可以理解为一种更安全的宏。

2.宏

  • 处理时机:预编译间段。
  • 作用:文本替换,没有安全检查和类型检查。

三.内联函数和static修饰的函数的区别

1.内联函数

  • 没有开栈和清栈的开销
  • 直接在调用点把代码展开 

2. static修饰的函数

  • 有开栈和清栈的开销
  • 把属性设为local

四.使用inline的时机

  • 开栈清栈的开销 > 执行的开销 ---> 函数体较小,建议写为inline函数
  • 开栈清栈的开销 < 执行的开销 ---> 函数体较大,不建议写为inline函数

五.内敛函数的缺点

  1. 编译时,编译器不知道形参的值,无法知道递归和循环运行的次数。
  2. 内联函数只在release版本生效,在debug版本不生效。
  3. 内联函数是基于实现的,不是基于声明的。
  4. 以代码膨胀为代价,以空间换时间。 

六.使用内联函数时需要注意的事项

1.内联函数只是给编译器的一个建议,即最终是否将某个函数当为内联函数来处理是由编译器来决定的。

2.内敛函数只能写在头文件中。

内联函数发生上面那种替换是在编译期间,在编译期间编译器为了找到需要找到内联函数的定义,所以在为了方便编译器找到定义,每个文件引用头文件后,都直接拥有这种定义,而不用再去写。而普通函数可以申明和定义分离,主要是编译阶段就不需要函数定义。首先编译阶段找到函数的申明,链接阶段才会去找函数的定义,将之关联起来。

inline函数的特征是在调用的地方插入相应函数的代码,所以编译之后的目标文件里是没有inline函数体的,因为在要调用的地方它都已经用相应的语句替换掉了(当然这只限于内联成功的情况)。
如果我们将inline函数写在cpp文件里,但是绝大多数情况下,在我们用第三方类库的时候,我们只有头文件和目标文件(没有cpp文件),当你调用那个内联函数时,编译器没办法找到它。所以说将inline函数写在cpp文件中是没什么用的。

3.内联函数只在本文件中可见。

 

  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值