inline函数_inline内联函数

329564468660aa9c477e7256fc7bfd68.png
C++中的inline用法 - Boblim - 博客园​www.cnblogs.com

1.引入inline的原因

为了解决一些频繁调用但代码量很小的函数引起的大量消耗栈空间(内存)的问题

栈空间 用来存放程序的局部数据(函数内数据)的内存空间

在系统中,栈空间是有限的,如果大量频繁的使用会造成因栈空间不足而导致的程序出错的问题,例如函数的死循环递归调用的最终结果就是导致占内存空间的枯竭。

#include 

虽然上述例子加不加inline的效果并不是很明显,但是内部,会把所有调用dbtest(i)的地方全部换成(i %2>0)?"奇":"偶",这样就避免了频繁调用函数堆栈空间重复开辟所带来的消耗。

2.inline使用限制

inline只适合简单的函数使用,不能包含复杂的结构控制语句例如switch,while,并且不能是直接递归函数(自己调用自己);

3.inline只是对编译器的一个建议

我们声明定义了内联函数,但是要看编译器怎么决定,他觉得函数不复杂,可以在调用的地方展开,就会执行内联程序,但是如果编译器认为函数复杂,展开的开销比调用造成的栈空间消耗还大,就不会内联。

4.最好把inline的定义放在头文件中

想让编译器方便调用内联函数,就必须放在它可以随时够得着的地方,且保证每次调用都一致,最好的方式就是在头文件定义一次。

5.类中的成员函数与inline

定义在类中的成员函数缺省(默认)都是内联的,如果在类定义时就在类中内给出函数定义,当然最好。

如果在类中没给出成员函数定义,而又想内联该函数的话,那在类外要加上inline,否则就认为不是内联的。

内联函数:在类中给出定义

类中声明,类外定义时加上inline(不加,不是内联)

class 

将成员函数的定义体放在类声明之中虽然能带来书写上的方便,但不是一种良好的编程风格,上例应该改成:

// 头文件
// 定义文件

6.inline只有在定义时在管用,放在声明处不管用

7.原理和适用场景

内联是以代码膨胀(复制)为代价,仅仅省去了函数调用的开销,从而提高函数的执行效率。但是如果函数内代码太长,复制的消耗比调用的消耗还大,那么就达不到原来的目的的。

不适用的场景:

(1)函数内代码过长,使用内联将导致内存消耗代价较高

(2)如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销还大。类的构造和析构函数会让人误以为成为内联函数会更有效。到那时要当心一些隐藏行为,如:"偷偷"执行基类或成员对象的构造函数和析构函数,这是就不要把构、析函数定义在类中,放在类外,定义为内联函数,让编译器自己做合适的选择,看看是不是合适内联。定义在类外的内联函数,可以有编译器自动选择是否内敛,是最明智的选择!

8.总结

内联函数就是通过 复制代码 代替 调用函数 造成的栈空间的开销。

但是如果复制代码的消耗(代码过长、出现循环) 大于 调用函数造成的栈空间的开销

就别用内联函数了。

虽然我们可以没心没肺的全部定义为内联函数(声明内联不管用,必须定义内联),让编译器自己去判断,合适的内联,不合适的不内联(至少保证一部分优化),但是这样要看编译器的心情了,如果编译器拒绝内联,效果就不好了,为了防止,我们就自己先做个判断,让机器少做决定的好

不是原创,算是读书笔记吧!感谢原博主大神!

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值