函数优化中inline的用法

问题

函数的第一规则是短小,第二规则也是短小 - clean code

那么我们针对大函数,第一步是将函数拆解成一个个逻辑清晰功能单一的小函数;那么当拆解成一个个小函数后,性能会不会受到影响呢?

回答

要想知道性能会不会受到影响,我们首先要了解function call的过程:
function call:
在这里插入图片描述
在function call过程中会存在function call frame的切换,中间会涉及ebp保存、caller register保存(非必须)、calle register保存(非必须)、以及return address;这些都会产生额外的性能。所以会产生性能影响。

解决方法

C/C++中提供了inline关键字,用于解决部分function call带来的性能开销。
首先在c++类成员函数的inline属性中介绍:inline指示字只不过是一种提示,编译系统可以去做,常常也会忽略它们
所以存在一些情况,虽然添加了inline关键字,但函数不是inline的(这里如何判断函数是否inline,可以使用readelf -s --wide | grep “func”, 来查看编译的二进制是否含有相应的符号);
一些情况是明显不会inline的:

  1. 使用debug编译
  2. 包含递归
  3. …(其他编译器行为)

编译器有一个准则是,当inline一个函数时,是不会改变函数的能力的(inline和不inline执行的结果相同)。

inline方法中参数是传引用还是传值

当我们定义inline方法时,往往会想参数是传值还是传引用,哪种性能最好?
可以参考should I take arguments to inline functions by reference or value?这个回答;
对于简单类型,传值和穿引用,当inline后,编译器处理后,效果相同。
对于非简单类型,可能会有区别。

那么我们按照什么规则去做呢?
按照编译器的准则:当inline一个函数时,是不会改变函数的能力的(inline和不inline执行的结果相同);我们定义函数时,主要考虑函数的功能,是否需要更改传入参数来决定是传值还是传应用(当不需要修改入参时,对于基本类型,传值即可(引用的拷贝往往比基本类型大),当复杂类型时,传引用)。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值