Linux内核中的两个宏: likely & unlikely

可以在驱动中经常看到这样的代码:
if(likely( x > 1)){
      /* … */
}
else {
      /* … */
}
一开始不知道是做什么用的,后来问了海哥,他说是一个编译优化的宏,这东西表示likely()中的那个表达式成立的概率比较高,就会让cache中优先存放if之后的语句。
今天去查了下这两个宏的定义:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)
__builtin_expect((x),1) 表示的是我们对x表达式成立的期望值是1.
这样编译器编译出汇编代码的时候就会把if下面的语句紧接着之前的代码.
而unlikely(x)则会把 else之后的代码紧接着之前的代码。这样cpu就会优先把那部分代码放到cache中去。