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

标签 c++ c gcc llvm-clang micro-optimization

我不是在问 __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 is used to indicate that a branch condition is unpredictable by hardware mechanisms such as branch prediction logic.

Example of use:

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

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

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

相关文章:

c++ - for_each(for_each())?

c++ - Eclipse-PDT:更改包含文件夹

c++ - 内置类型的对象是否具有特殊的静态初始化顺序优先级?

java - 如何将字符串编码为 8 位 ASCII 字符?

c++ - 以下代码的时间复杂度..?

在C中将字符串转换为int

php - 在 php 上运行 exec 命令

c++ - new 表达式中详细类型说明符的条件表达式解析错误

c++ - cv::erode 导致错误:OpenCV 错误:Mat 中的断言失败(m.dims >= 2)

c - 具有可变目标的 makefile