1. 代码:
在很多源码如Linux内核,我们都能看到likely()和unlikely()这两个宏。
通常这两个宏定义是下面这样的形式。
#define LIKELY(x) __builtin_expect(!!(x),1)
//表示 x 的值为真的可能性更大
//如: if(likely(1))
#define UNLIKELY(x) __builtin_expect(!!(x),0)
//表示 x 的值为假的可能性更大。
//如: if(unlikely(!0))
可以看出这2个宏都是使用函数 __builtin_expect()实现的, __builtin_expect()函数是GCC的一个内建函数(build-in function).
2. 解释:
如果能事先判断一个if语句时经常为真还是经常为假,那么可以用unlikely和likely来优化这段判断的代码。
如:
if(1){……} 这样这里就可以使用 if(likely(1))
if(0){……} 这样这里就可以使用 if(unlikely(!0))
if(likely(something)) //等价于 if(something) 等于 if(1)
//表示 something 为真 情况经常发生likely
if(unlikely(!something)) //等价于 if(!something) 等于 if(!0)
//表示 !something 为真 情况很少发生 可以忽略掉 unlikely
3. 原因:
由于大部分程序员在分支预测方面做得很糟糕,
所以GCC 提供了这个内建函数来帮助程序员处理分支预测.
参考:
https://www.cnblogs.com/LubinLew/p/GCC-__builtin_expect.html