Bre*_*ent 4 c c++ gcc micro-optimization llvm-clang
我不是在问类似的事情__builtin_expect
。我在考虑一种情况,即我不知道分支通常是对还是错,但是我确实知道分支是可预测的(或不是可预测的)。
我希望编译器在知道分支是可预测的之后,更有可能生成分支,并且知道它是不可预测的,因此更有可能在没有分支的情况下生成有条件执行的指令。
在主要编译器中可能吗?(专门考虑gcc和clang)。
解释“可预测”和“可能”为何不同的示例
int x = rand()%2;
while (true) {
if (x) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
该if
声明既不太可能也不太可能,但可以高度预测。
while (true) {
if (rand()%5 > 0) {
// do something
}
}
Run Code Online (Sandbox Code Playgroud)
在这种情况下,情况恰恰相反:分支很有可能(占80%的时间),但不可预测。
将我的评论转换为答案:
lang有__builtin_unpredictable
:
__builtin_unpredictable
用于表示分支条件是硬件机制(例如分支预测逻辑)无法预测的。使用示例:
Run Code Online (Sandbox Code Playgroud)if (__builtin_unpredictable(x > 0)) { foo(); }
https://clang.llvm.org/docs/LanguageExtensions.html#builtin-unpredictable