編集:UBを削除した後(良い場所、見逃しました)、時間はほぼ同じです。モデレーターにフラグを立てて削除します。
これらの 2 つの関数は、両方の分岐で ,foo
の内側に return があるという事実を除いて同一ですが、最後に単一の関数があります。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 ミリ秒
違いは小さいですが、そこにあります。なんで?また、コンパイラがそれらを同じものに最適化しないのはなぜですか?