それでは、実際のコンパイラを使用して違いがあるかどうか見てみましょう。
次のコード:
int foo(int a, int b)
{
if(a)
return 5;
else if(b)
return 2;
else
return 56582201;
}
int bar(int a, int b)
{
if(a)
return 5;
else
{
if(b)
return 2;
else
return 56582201;
}
}
GCC 4.8.0 でコンパイルすると、g++ a.cpp -fdump-tree-gimple -c
(そうです、最適化なしで) として呼び出され、次の GIMPLE (GCC の内部表現) が得られます。
int foo(int, int) (int a, int b)
{
int D.2205;
if (a != 0) goto <D.2203>; else goto <D.2204>;
<D.2203>:
D.2205 = 5;
return D.2205;
<D.2204>:
if (b != 0) goto <D.2206>; else goto <D.2207>;
<D.2206>:
D.2205 = 2;
return D.2205;
<D.2207>:
D.2205 = 56582201;
return D.2205;
}
int bar(int, int) (int a, int b)
{
int D.2211;
if (a != 0) goto <D.2209>; else goto <D.2210>;
<D.2209>:
D.2211 = 5;
return D.2211;
<D.2210>:
if (b != 0) goto <D.2212>; else goto <D.2213>;
<D.2212>:
D.2211 = 2;
return D.2211;
<D.2213>:
D.2211 = 56582201;
return D.2211;
}
ご覧のとおり、違いは変数名とラベル名のみであり、これらは後で破棄されます。
Clang でコンパイルすると、同様の結果が得られます。LLVM IR は実質的に同じです。
いいえ、最適化なしでコンパイルしても違いはありません。