可能(真实)属性的重点是什么

时间:2017-01-15 20:10:45

标签: c++ attributes

我刚刚在cppreference上阅读了有关C ++属性的内容。他们在那里提到了可能的(真实的)属性,现在我想知道它有什么好处。不幸的是,我无法在网上找到更多信息。

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

1 个答案:

答案 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

您可以使用with this example at codebolt.org