在if-else if链中使用Likely()/不可思议()预处理器宏

Leo*_*Leo 6 c++ macros gcc compiler-optimization likely-unlikely

如果我有:

#define likely(x)       __builtin_expect((x),1)
#define unlikely(x)     __builtin_expect((x),0)

if (A)
    return true;
else if (B)
    return false;
...
else if (Z)
    return true;
else
    //this will never really happen!!!!
    raiseError();
    return false;
Run Code Online (Sandbox Code Playgroud)

我可以在最后一个条件检查中放置possible(),else if (likely(Z))以表示最终语句(else)非常不可能,而编译器不会影响先前检查的分支预测吗?

基本上,如果存在带分支预测器提示的单个条件语句,GCC是否会尝试优化整个if-else if块?

Kon*_*rov 9

你应该明确这样做:

if (A)
  return true;
else if (B)
  return true;
...  
else if (Y)
  return true;
else {
  if (likely(Z))
    return true;

  raiseError();
  return false;
}
Run Code Online (Sandbox Code Playgroud)

现在编译器清楚地了解您的意图,并且不会重新分配其他分支概率.代码的可读性也增加了.

PS我建议你重写Linux内核以防止静默整体转换的方式也可能和不太可能:

#define likely(x)      __builtin_expect(!!(x), 1)
#define unlikely(x)    __builtin_expect(!!(x), 0)
Run Code Online (Sandbox Code Playgroud)