我不是在问像__builtin_expect
这样的事情。我想的是我不知道分支通常是真的或通常是假的,但我确实知道它是可预测的(或不是)。
我希望编译器知道分支是可预测的,更有可能生成分支,并且知道它是不可预测的,更有可能生成没有分支的条件执行指令。
这在主要编译器中是否可行? (特别考虑gcc和clang)。
解释为什么“可预测”和“可能”不同的例子
int x = rand()%2;
while (true) {
if (x) {
// do something
}
}
if
声明既不可能也不可能,但具有高度可预测性。
while (true) {
if (rand()%5 > 0) {
// do something
}
}
在这种情况下,情况正好相反:分支很可能(占80%的时间),但不可预测。
将我的评论转换为答案:
clang有__builtin_unpredictable
:
__builtin_unpredictable
用于指示分支条件是由分支预测逻辑等硬件机制无法预测的。使用示例:
if (__builtin_unpredictable(x > 0)) { foo(); }
https://clang.llvm.org/docs/LanguageExtensions.html#builtin-unpredictable