在2.6内核中,随处可见likely()与unlikely(),下面就来分析一下他们的区别。首先要明确一点:
if(likely(value))等价于if(value);if(unlikely(value))也等价于if(value),也就是说从阅读和理解代码的角度来看,likely()与unlikely()是一样的。
在2.6.28内核中,这两个宏的定义如下:
#define likely(x) __builtin_expect(!!(x), 1) #define unlikely(x) __builtin_expect(!!(x), 0)
例如上篇日志中的 IS_ERR_VALUE宏定义:
#define IS_ERR_VALUE(x) unlikely((x) >= (unsigned long)-MAX_ERRNO)
可以这样理解,x >= (unsigned long)-MAX_ERRNO 的可能性要小,也就是说x为错误指针的可能性要小,这也完全符合实际情况,因为内核函数返回指针出错的概率要比正确的概率小。