慢慢学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))
{}