慢慢学Linux驱动开发,第十章,GNU C的扩展

  内核开发者使用的C语言涵盖了ISO C99标准和GNU C扩展特性。这里简单介绍一下GNU C的扩展特性。

  1.内联(inline)函数

  GNU的C编译器支持内联函数,也是C++的一个特性之一。就是函数会在所调用的位置上展开,这样做虽然会导致代码量的增加,会占用更多的内存空间或者占用更多的指令缓存,但是确可以消除函数调用和返回所带来的开销,对于那些代码量少又需要经常调用的函数来说还是必须的。所以很显然对于一个很长的程序是不建议定义为内联函数的。

  定义一个内联函数的时候,需要使用static作为关键字,并且用inline限定它:

  static inline void Set_Bit(UINT8 res);

  内联函数必须在使用之前就定义好,否则编译器就没法把这个函数展开。实践中一般在头文件中定义内联函数。由于使用了static作为关键字进行限制,所以编译时不会为内联函数单独建立一个函数体。

  因为宏定义不具有类型检查的优点,所以建议优先使用内联函数而不是复杂的宏。

  2.内联汇编

  GCC编译器支持在C函数中嵌入汇编指令。注意体系结构的不同,汇编不具有移植性。

  3.分支声明

  对于条件选择语句,gcc内建了一条指令用于优化,在一个条件经常出现,或者该条件很少出现的时候,编译器可以根据这条指令对条件分支选择进行优化。内核把这条指令封装成了宏,比如likely()和unlikely():

  /*foo几乎不出现*/
  if(unlikely(foo))
  {}
/*foo经常出现*/
if(likely(foo))
{}

  

  

posted @ 2012-03-08 20:42  云说风轻  阅读(404)  评论(0编辑  收藏  举报