防止编译器分离函数的指令

时间:2019-12-24 11:33:23

标签: c++ windows visual-studio optimization

我有一段具有这种结构的代码:

__forceinline void problemFunction(bool condition, int & value)
{
    if (condition)
    {
        value = 0;
        return;
    }

    // ...
    // a lot of calculations
    // ...
}

void caller()
{
    bool condition;
    int value;

    // ...

    problemFunction(condition, value);
    someOtherStuff();
}

但是在构建“发行版”配置并在“反汇编”中启用了优化的情况下,我得到了以下信息:

void caller()
{
    bool condition;
    int value;

    // ...

    if (condition)
        value = 0;
    else
        goto CalculateLabel;

ReturnProblemFunctionLabel:

    someOtherStuff();
    goto ReturnLabel;

CalculateLabel:
    // ...
    // a lot of calculations
    // ...
    goto ReturnProblemFunctionLabel;

ReturnLabel:

}

ProblemFunction分为两部分。问题是第二部分位于someOtherStuff函数调用之后。

如何在本地抑制这种优化?

我正在Windows 10上使用Visual Studio 2019版本16.4.2。

1 个答案:

答案 0 :(得分:0)

在C ++ 20中,您可以使用“可能/不太可能”属性标记分支(请参见this questioncppreference),这可以为编译器提供有关如何更好地优化代码的提示。在您的原始帖子中,我假设传递给problemFunction的条件通常是假的,这在大多数情况下意味着不必要的跳转。

正如在godbolt上看到的那样,如果用if标记[[unlikely]]语句,则g ++将输出所需的结果,但是msvc不会更改生成的代码。请注意,此示例只是一个基本演示。编译实际程序可能会得出不同的结果。

还请注意,由于分支预测,跳转并不一定意味着性能下降。您必须测量执行时间才能得出有意义的结论。