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

Are there any builtins to tell compiler whether a branch is predictable?

本文关键字:是否 编译器 分支 任何 内置 函数      更新时间:2023-10-16

我不是在问像__builtin_expect这样的事情。我正在考虑这样一种情况,我不知道分支通常是真的还是通常是假的,但我知道它是可预测的(或不可预测的(。

我希望编译器知道分支是可预测的,更有可能生成分支,

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

这在主要编译器中可能吗?(特别是gcc和clang(。


解释为什么"可预测"和"可能"不是一回事的例子

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

if的说法既不可能也不太可能,但高度可预测。

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

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

将我的评论转换为答案:

叮当有__builtin_unpredictable

__builtin_unpredictable用于指示分支条件无法通过硬件机制(如分支预测逻辑(进行预测。

使用示例:

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

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