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

问题描述 投票:3回答:1

我不是在问像__builtin_expect这样的事情。我想的是我不知道分支通常是真的或通常是假的,但我确实知道它是可预测的(或不是)。

我希望编译器知道分支是可预测的,更有可能生成分支,并且知道它是不可预测的,更有可能生成没有分支的条件执行指令。

这在主要编译器中是否可行? (特别考虑gcc和clang)。


解释为什么“可预测”和“可能”不同的例子

int x = rand()%2;
while (true) {
    if (x) {
        // do something
    }
}

if声明既不可能也不可能,但具有高度可预测性。

while (true) {
    if (rand()%5 > 0) {
        // do something
    }
}

在这种情况下,情况正好相反:分支很可能(占80%的时间),但不可预测。

c++ c gcc llvm-clang micro-optimization
1个回答
6
投票

将我的评论转换为答案:

clang有__builtin_unpredictable

__builtin_unpredictable用于指示分支条件是由分支预测逻辑等硬件机制无法预测的。

使用示例:

if (__builtin_unpredictable(x > 0)) {
    foo();
}

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

© www.soinside.com 2019 - 2024. All rights reserved.