if-else if-else if-else
ブロックのifが書き込まれた順序でテストされるという保証はありますか。
最も頻繁なケースを最初に置くことでコードを最適化しようとすることがよくあり、コンパイラーによって行われた最適化によって if がテストされる順序が変わる可能性があるかどうかを知りたいので、私はそれを求めています。
したがって、次のようなコードを書いている場合:
if (cond1) // First if (for the case I have the most often)
{
doSomething1();
}
else if (cond2) // Second if (for the second case I have the most often)
{
doSomething2();
}
else if (cond3) // Third if (for the third case I have the most often)
{
doSomething3();
}
else
{
doElse();
}
(リリース用に)コンパイルされた後、最初のifがテストされ、次に2番目のif、次に3番目のifがテストされるという保証はありますか(そして、条件がどれも真でない場合、最後にelseが実行されます)。
デバッグ時には、if は私が書いた順序で実行されることはわかっていますが、プログラムがリリース用にコンパイルされるときもそのままです (私は主に g++ と Visual Studio の最近のバージョンを使用しています)。
また、条件は環境に影響を与える可能性があるため(if (i=a)
またはのようif(myfunction())
に)、記述どおりに実行する必要がありますが、コンパイラーが実行できる最適化が欠けているのではないかと思います。これにより、ifsがテストされる順序が変更されます. 特に、条件にそのような副作用がない場合:
void test(int a)
{
if (a == 1)
{
doSomething1();
}
else if (a == 2)
{
doSomething1();
}
else if (a == 3)
{
doSomething1();
}
else
{
doSomething1();
}
}