Tho*_*ell -2 c++ performance conditional
我今天正在重写我的一些旧代码以优化它并使其更易读(因为其中一些非常粗略地注释)并且我想知道这些代码块之间是否存在任何技术性能差异:
if( cond1 )
{
// Do something.
}
else if( cond2 )
{
// Do something else.
}
Run Code Online (Sandbox Code Playgroud)
和:
if( cond1 )
{
// Do something.
}
else
{
if( cond2 )
{
// Do something else.
}
}
Run Code Online (Sandbox Code Playgroud)
我告诉自己应该没有性能成本,因为应该进行相同数量的比较,但我只是好奇是否有一些我忽略的东西.
小智 8
那么,让我们看看,如果使用真正的编译器有任何区别.
以下代码:
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;
}
}
Run Code Online (Sandbox Code Playgroud)
当使用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;
}
Run Code Online (Sandbox Code Playgroud)
如您所见,差异仅在于变量和标签名称,并且无论如何都将在以后丢弃.
使用Clang进行编译会得到类似的结果:LLVM IR实际上是相同的.
所以不,没有区别,即使你没有优化编译.
它们完全一样.编译器不会像编写代码那样完全编译代码.仅仅因为你写东西的方式有所不同,这并不意味着编译的可执行文件有区别.只要结果程序的行为与C++标准描述的一样,就可以根据需要对其进行操作.这被称为as-if规则.由于您提供的两个代码示例根据标准具有完全相同的行为,因此编译器可能会将它们编译为相同的可执行文件.