我不是在问诸如 __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 :



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

关于c++ - 是否有任何内置函数可以告诉编译器分支是否可预测?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/55824061/

10-11 07:30