__buildin_expect
功能是将分支转移信息提供给编译器,这样编译器可以对代码进行优化,以减少指令跳转带来的性能下降。
__buildin_expect 是 gcc 引入的指令,它允许编码人员将最有可能 的分支告诉编译器。写法为:
__buildin_expect(exp, n)
意为 exp == n 的概率很大。
一般的使用方法是将 __buildin_expect 指令封装为 likely 和 unlikely 宏,两个宏的写法如下:
#define likely(x) __builtin_expect(!!(x), 1) // x为真的可能性很大 #define unlike(x) __builtin_expect(!!(x), 0) // x为假的可能性很大
需要明确的是:
if (likely(value)) // 等价于 if (value) if (unlike(value)) // 也等价于 if (value)
示例:
if (unlikely(x > 0)) { y = 1; } else { y = -1; }
在上面的代码中 gcc 编译的指令会预先读取 y = -1 这条指令,这适合 x 的值大于 0 的概率比较小的情况,这样系统在运行时就会减少重新取指的动作。