在内核代码的条件分支中的判断中,经常可以看到如下两条语句:
/* ...... */
if(unlikely(!something))
/* ...... */
if(likely(something))
/* ...... */
追述一下可以看到有如下的宏定义:
#define likely(x) __builtin_expect(!!(x), 1)
#define unlikely(x) __builtin_expect(!!(x), 0)
当我们在进行判断测试时,表达式的值等于一个常量C,如EXP==C:
if(__builtin_expect (x, 0))
fun()
希望表达式EXP的值为0,不执行fun()
if(__builtin_expect (prt!=NULL, 1))
fun()
希望表达式EXP的值为1,执行fun()
这样,那么以下的形式就好解释了:
#define unlikly(p) __builtin_expect(!!(p),0)
更大的期望表达式的值为0,!!双重否定表肯定了