我刚刚在cppreference上阅读了有关C ++属性的内容。他们在那里提到了可能的(真实的)属性,现在我想知道它有什么好处。不幸的是,我无法在网上找到更多信息。
这是处理器在执行期间使用的某种分支预测吗?
答案 0 :(得分:5)
是的,确切地说。它用于为编译器提供有关if
语句的更多信息,以便它可以根据目标微架构生成最佳代码
虽然每个微架构都有自己了解分支机构可能性的方法,但我们可以从英特尔优化手册中找到一个简单的例子
汇编/编译器编码规则3.(M影响,H一般性)安排代码与 静态分支预测算法:使条件分支后面的连通代码成为 可能是具有前向目标的分支的目标,并使有条件的后续代码生成 对于具有向后目标的分支,分支是不太可能的目标。
简单地说,前向分支的静态预测是 not-taken (因此分支之后的代码是推测性执行的,它是可能的路径),而后向分支的静态预测是采取(因此分支后的代码不是推测性执行的。)
考虑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