编辑:删除 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;
}
这些数字只是为了让优化不会太费力,函数调用也不会被优化掉。在 MSVS 2010 上进行了全面优化。
调用函数4000000000次,采样 10 次,foo
总是更快:
foo
-平均8830 毫秒goo
-平均8703 毫秒
差异很小,但它就在那里。为什么?另外,为什么编译器不将它们优化为相同的东西?