<linux/compiler.h> 2.6.36
142 # define likely(x) __builtin_expect(!!(x), 1)
143 # define unlikely(x) __builtin_expect(!!(x), 0)
long __buildin_expect(long EXP, C)是GCC的内置函数,用来给编译器提供分支预测信息:期望EXP==C,返回值是EXP。其中C是编译时常量。
eg:
if(__buildin_expect(ptr != NULL, 1)) error(); // 期望ptr!=NULL为1;当期望满足时(返回的ptr != NULL为1)执行error()
if(__buildin_expect(x,0)) foo(); // 期望x==0;当期望未满足(返回的x为真)时执行foo()
总之:
if(likely(x)) foo(); // 期望x为真,且x为真时执行foo()
if(unlikely(x)) foo(); // 期望x为假,且x为真时执行foo()
也就是说,likely()和unlikely()都是在x为真时执行分支下面的语句;不同的是likely()期望x为真,unlikely期望x为假,
--
ref:
http://blog.richliu.com/2007/02/01/428/