内联(inline)函数的优缺点
2015-12-01 09:23
281 查看
最近在看LinuxKernel Development,这本书主要是讲了Linux内核的概念,对于整体的框架有了一个描述,这里记录下看到的一些有用的东西,便于以后整理。
Inline这个名称就可以反映出它的工作方式,函数会在它所调用的位置上展开。这么做可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,由于编译器会把调用函数的代码和函数本身放在一起优化,所以也有进一步优化代码的可能。不过这么做是有代价的,代码会变长,这就意味着占用更多的内存空间或者占用更多的指令缓存。内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。如果你把一个大块头的程序做成了内联函数,却不需要争分夺秒,反而反复调用它,这么做就失去了内联的意义了。
总结:对于简短的函数并且调用次数比较多的情况,适合使用内联函数。
使用方法:定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它(没试过,暂且留在这里)。比如:
static inline void dog(unsigned long tail_size);
内联函数必须在使用前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以在编译时不会为内联函数单独建一个函数体(这里不太明白)。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。
注意:在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。
Inline这个名称就可以反映出它的工作方式,函数会在它所调用的位置上展开。这么做可以消除函数调用和返回所带来的开销(寄存器存储和恢复),而且,由于编译器会把调用函数的代码和函数本身放在一起优化,所以也有进一步优化代码的可能。不过这么做是有代价的,代码会变长,这就意味着占用更多的内存空间或者占用更多的指令缓存。内核开发者通常把那些对时间要求比较高,而本身长度又比较短的函数定义成内联函数。如果你把一个大块头的程序做成了内联函数,却不需要争分夺秒,反而反复调用它,这么做就失去了内联的意义了。
总结:对于简短的函数并且调用次数比较多的情况,适合使用内联函数。
使用方法:定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它(没试过,暂且留在这里)。比如:
static inline void dog(unsigned long tail_size);
内联函数必须在使用前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以在编译时不会为内联函数单独建一个函数体(这里不太明白)。如果一个内联函数仅仅在某个源文件中使用,那么也可以把它定义在该文件开始的地方。
注意:在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。
相关文章推荐
- 多个checkbox的选中与未选中js代码
- [数据结构]队列的基本操作
- dorado培训笔记
- linux下微妙级别定时实现
- python2.x和3.x的区别
- 使用java API查询java类
- java常用系统包介绍
- 泛型相关
- mybatis写mapper文件注意事项
- 移动端报表使用教程-如何查看报表
- ☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆☆
- java的访问控制(包、访问修饰符、修饰符)
- css实现右侧固定宽度,左侧宽度自适应
- struts2:数据校验,通过XWork校验框架实现(validation.xml)
- 使用Git命令把本地项目上传到Github托管
- L2TP中LAC与LNS
- 天地图结合ArcGIS api for JavaScript实现点聚合ClusterLayer
- Winform状态栏控件中Label靠右显示的方法
- 开机自动启动VM中的虚拟机
- flex 给文本框添加控制输入法的