那么,让我们看看使用真正的编译器是否有任何区别。
以下代码:
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 实际上是相同的。
所以不,没有区别,即使你在没有优化的情况下编译。