在内核中常会见到下面这样的代码。
这个likely()和unlikely()其实是宏定义。原始定义在 include/linux/compiler.h中,如下:
__builtin_expect是GCC内建的函数。下面引用linuxform中的一篇讲GCC扩展文章
的一部分(原我找到的也是引用的文章,此处给出链接),里面解释得很清楚。
总结,这个宏主要是优化的作用。如果英文好的话可以看文章一开始给出的
在kernelnewbies中的链接,那里有更详细的解说。
细心的人应该留意到有一点不同,likely()一开始偶给的定义为__builtin_expect(!!(x),1)。
后来的文章解说中成了__builtin_expect((x),1)。
这应该是后来的版本更改所至。就是新近版本的内核已经更改成__builtin_expect(!!(x),1).
加上个“!!”有什么好处哩。我想是因为使代码强壮与兼容的原因。因为不能保证x表达式的结果一定是1或0,有可能是非0数。加了“!!”,结果就一定是在1和0范围内了。