__builtin_expect

__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 的概率比较小的情况,这样系统在运行时就会减少重新取指的动作。

原文地址:https://www.cnblogs.com/tongyishu/p/13406141.html