Linux内核使用的GNUC扩展

投资自己,什么时候都不晚。

和Unix一样,Linux内核也是用C语言实现的。谈到C,几乎所有的人都会立即想到ANSIC标准。但是Linux内核的实现,其实并不完全符合ANSI C标准。实际上,内核开发者总会使用许多gcc提供的C语言的扩展部分。内核开发者使用的C语言涵盖了ISO C99标准和GNU C的扩展特性,我想,其中让人感兴趣的,应该不在于C99标准上,而是在于它的GNU C扩展特性上。下面,我们就一起来学内核使用的GNU C扩展特性吧。

1.内联函数

  • GNU的C编译器支持内联函数,这一点和ANSI标准完全不一样。在ANSI C中是没有inline这个关键字的。内联函数会在函数调用的地方直接把函数体展开,这样就可以减少函数调用的开销了(寄存器(现场)的保存和恢复)。而且,由于编译器会把调用函数的代码和函数本身的代码放在一起优化,所以也会有进一步优化代码的可能。
  • 当然,天底下没有白吃的午餐,这样做也是有代价的,那就是生成的代码会变长,这就意味着你必须使用更多的内存空间或更多的指令缓存来执行代码。
  • 内核开发者通常把那些对时间要求较高,而本身长度又较短的函数定义成内联函数。当然了,对于大块头的程序,你想把它定义成内联函数也没人反对。只不过,有这必要么?
  • 定义一个内联函数,需要使用static作为关键字,并且用inline限定它。如:
    static inline void foo(){...}
    内联函数必须在使用之前就定义好,否则编译器没法儿将之展开。由于使用static关键字进行限制,编译时不会为内联函数单独建立一个函数体。
  • 内联函数一般定义在头文件中,当然了,如果你仅仅在某个源文件中使用内联函数,也可以把它定义在源文件的开头部分。
  • 在内核中,为了类型安全的原因,优先使用内联函数而不是复杂的宏。

2.内联汇编

还有 84% 的精彩内容
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。
支付 ¥1.00 继续阅读

相关阅读更多精彩内容

  • 一、温故而知新 1. 内存不够怎么办 内存简单分配策略的问题地址空间不隔离内存使用效率低程序运行的地址不确定 关于...
    SeanCST阅读 8,241评论 0赞 27
  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 11,168评论 0赞 13
  • 原文作者 Sandeep.S英文原文 [https://www.ibiblio.org/gferg/ldp/GCC...
    JeffreyLi阅读 40,666评论 8赞 41
  • 计算机系统漫游 代码从文本到可执行文件的过程(c语言示例):预处理阶段,处理 #inlcude , #defin...
    willdimagine阅读 3,979评论 0赞 5
  • HttpServlet 类需要两个参数HttpRequest和HttpResponse。比如doGet方法 那我在...
    FantJ阅读 31,897评论 1赞 6

友情链接更多精彩内容