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块?
你应该明确这样做:
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)