为什么移动返回函数的末尾效率较低?

Luc*_*ore 5 c++ optimization performance

编辑:删除UB(好位置,我错过了),时间或多或少相同.将标记主持人以删除它.

这两个函数是相同的,除了在两个分支上都有foo返回的事实if,而在末尾goo有一个单独的函数return:

int foo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
        return x-1;
    }
    else
    {
        x++;
        return x-1;
    }
}
int goo()
{
    static int x = 0;
    if ( x )
    {
        x > 2 ? x = 0 : ++x;
    }
    else
    {
        x++;
    }
    return x-1;
}
Run Code Online (Sandbox Code Playgroud)

这些数字只是因此优化不会过于激烈而且函数调用没有被优化掉.在MSVS 2010上进行了全面优化编译.

调用函数40亿次,采样10次,foo永远快:

  • foo- 平均8830毫秒
  • goo- 平均8703毫秒

差异很小,但它就在那里.为什么?另外,为什么编译器不能将它们优化为同一个东西?

Tor*_*zki 3

查看汇编器输出,goo() 的第一个分支中可能会跳转到函数末尾。