C/C++ inline

引入inline的原因

我们知道,栈空间是有限的,假如频繁大量的使用就会造成栈空间不足进而导致程序出错,譬如说,我们写了个函数的死循环递归调用,那么的最终结果就是栈内存空间枯竭。
所以我们引入inline关键字,这么做就是为了解决一些频繁调用的小函数从而大量消耗栈空间(栈内存)的问题。
inline是一个关键字,放在函数名之前使得函数成为内联函数。

注意:

inline只适合函数体内部代码简单的函数使用,不能包含复杂的结构控制语句例如while、switch,并且不能内联函数本身不能是直接递归函数(即,自己内部还调用自己的函数)。

inline仅是一个对编译器的建议,不是我们要内联就有得内联(就像大学不是你要联谊就有得联谊),具体内联与否,还是要看编译器的脸色。

关键字inline 必须与函数定义体放在一起才能使函数成为内联,仅将inline放在函数声明前面不起任何作用。

定义在类中的成员函数缺省都是内联的。

建议:inline函数的定义放在头文件中

因为内联函数要在调用点展开,所以编译器必须随处可见内联函数的定义,要不然就成了非内联函数的调用了。所以,这要求:

  • 每个调用了内联函数的文件都出现了该内联函数的定义。

因此,将内联函数的定义放在头文件里实现是合适的,省却为每个文件实现一次的麻烦。

慎用inline

内联函数可以提高执行效率,但是不可以将所有的函数都定义为内联函数。
因为内联是以代码膨胀(复制)为代价,是依靠省去函数调用的开销来提高效率的。

如果执行函数体内代码的时间,相比于函数调用的开销较大,那么效率的收获会很少。这时候没必要用inline。
另一方面,每一处内联函数的调用都会复制代码,这样会使得程序的总代码量增大,消耗更多的内存空间。

以下的情况不适合用内联函数:

  • 如果函数体内的代码比较长,使用内联将导致内存消耗代价较高。
  • 如果函数体内出现循环,那么执行函数体内代码的时间要比函数调用的开销大。类的构造函数和析构函数容易让人误解成使用内联更有效。要当心构造函数和析构函数可能会隐藏一些行为,如“偷偷地”执行了基类或成员对象的构造函数和析构函数。所以不要随便地将构造函数和析构函数的定义体放在类声明中。一个好的编译器将会根据函数的定义体,自动地取消不值得的内联(这进一步说明了inline 不应该出现在函数的声明中)。

参考来源

博客
https://blog.csdn.net/lym940928/article/details/88368363

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值