是否有任何内置函数可以告诉编译器分支是否可预测?

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%的时间),但不可预测。

m.s*_*.s. 6

将我的评论转换为答案:

lang有__builtin_unpredictable

__builtin_unpredictable 用于表示分支条件是硬件机制(例如分支预测逻辑)无法预测的。

使用示例:

if (__builtin_unpredictable(x > 0)) {
    foo();
}
Run Code Online (Sandbox Code Playgroud)

https://clang.llvm.org/docs/LanguageExtensions.html#builtin-unpredictable

  • 但是相反没有`__builtin_predictable`吗? (2认同)