if(likely(value)){}else{}简单从表面上看if(likely(value))== if(value),if(unlikely(value)) == if(value)。也就是likely和unlikely是一样的,但是实际上执行是不同的,加likely的意识是value的值为真的可能性更大一些,那么执行if的机会大,而unlikely表示value的值为假的可能性大一些,执行else机会大一些。加上这种修饰,编译成二进制代码时likely使得if后面的执行语句紧跟着前面的程序,unlikely使得else后面的语句紧跟着前面的程序,这样就会被cache预读取,增加程序的执行速度,likely和unlikely的实现在include/linux/compiler.h中: 9 #if __GNUC__ == 2 &&__GNUC_MINOR__ 10 #define __builtin_expect(x, expected_value) (x) 11 #endif 12 13 #define likely(x) __builtin_expect((x),1) 14 #define unlikely(x) __builtin_expect((x),0)__builtin_expect是gcc的一个预处理命令,其解释如下:long__builtin_expect (long exp, long c)You may use __builtin_expect to provide the compiler with branch predictioninformation. In general, you should prefer to use actual profile feedback forthis(‘-fprofile-arcs’), asprogrammers are notoriously bad at predicting how theirprograms actually perform. However, there are applications in which this dataishard to collect.The return value is the value of exp, which should be an integral expression.Thevalue of c must be a compile-time constant. The semantics of the built-in arethat itis expected that exp == c. For example:if (__builtin_expect (x, 0))foo ();would indicate that we do not expect to call foo, since we expect x to be zero.Sinceyou are limited to integral expressions for exp, you should use constructionssuch asif (__builtin_expect (ptr != NULL, 1))error ();when testing pointer or floating-point values.