我有一段具有这种结构的代码:
__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。
答案 0 :(得分:0)
在C ++ 20中,您可以使用“可能/不太可能”属性标记分支(请参见this question和cppreference),这可以为编译器提供有关如何更好地优化代码的提示。在您的原始帖子中,我假设传递给problemFunction
的条件通常是假的,这在大多数情况下意味着不必要的跳转。
正如在godbolt上看到的那样,如果用if
标记[[unlikely]]
语句,则g ++将输出所需的结果,但是msvc不会更改生成的代码。请注意,此示例只是一个基本演示。编译实际程序可能会得出不同的结果。
还请注意,由于分支预测,跳转并不一定意味着性能下降。您必须测量执行时间才能得出有意义的结论。