gpt4 book ai didi

c++ - probably(true) 属性有什么意义

转载 作者:行者123 更新时间:2023-11-30 01:08:41 30 4
gpt4 key购买 nike

我刚刚在 cppreference 上阅读了一些关于 C++ 中的属性的内容.他们在那里提到了 probable(true) 属性,现在我想知道它有什么用。遗憾的是,我无法在网上找到更多信息。

这是处理器在执行期间使用的某种分支预测吗?

最佳答案

是的,没错。它用于为编译器提供有关if语句的更多信息,以便编译器根据目标微架构生成最优代码

虽然每个微架构都有自己的方式来了解分支的可能性,但我们可以从英特尔优化手册中举一个简单的例子

Assembly/Compiler Coding Rule 3. (M impact, H generality) Arrange code to be consistent with the static branch prediction algorithm: make the fall-through code following a conditional branch be the likely target for a branch with a forward target, and make the fall-through code following a conditional branch be the unlikely target for a branch with a backward target.

简单地说,前向分支的静态预测是未采用(因此分支后的代码被推测执行,这是可能的路径)而后向分支是采用(所以分支之后的代码没有被推测执行)。

考虑 GCC 的这段代码:

#define probably_true(x) __builtin_expect(!!(x), 1)
#define probably_false(x) __builtin_expect(!!(x), 0)

int foo(int a, int b, int c)
{
if (probably_true(a==2))
return a + b*c;
else
return a*b + 2*c;
}

我在哪里使用了内置的 __builtin_expect模拟 [[problably(true)]]

编译成

foo(int, int, int):
cmp edi, 2 ;Compare a and 2
jne .L2 ;If not equals jumps to .L2

;This is the likely path (fall-through of a forward branch)

;return a + b*c;

.L2:
;This is the unlikely path (target of a forward branch)

;return a*b + 2*c;

ret

我在这里为您省去了一些汇编代码。
如果将 probably_true 替换为 probably_false,代码将变为:

foo(int, int, int):
cmp edi, 2 ;Compare a and 2
je .L5 ;If equals jumps to .L5

;This is the likely path (fall-through of a forward branch)

;return a*b + 2*c;

.L5:
;This is the unlikely path (target of a forward branch)

;return a + b*c;

ret

你可以玩with this example at codebolt.org .

关于c++ - probably(true) 属性有什么意义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41665775/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com