else if(cond){}和else {if(cond){}}的性能差异
Performance difference between else if( cond ) {} and else { if( cond ) {} }
我今天重写了我的一些旧代码来优化它,使它更容易辨认(因为其中一些代码的注释相当粗劣),我想知道这些代码块之间是否有任何技术性能差异:
if( cond1 )
{
// Do something.
}
else if( cond2 )
{
// Do something else.
}
:
if( cond1 )
{
// Do something.
}
else
{
if( cond2 )
{
// Do something else.
}
}
我对自己说,应该没有性能成本,因为应该进行相同数量的比较,但我只是好奇,是否有什么我忽略了。
让我们看看,如果使用真正的编译器有什么不同。
以下代码:
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实际上是相同的。
所以不,没有区别,即使你编译没有优化
它们完全一样。编译器不会完全按照您编写的代码编译代码。仅仅因为你写东西的方式不同,并不意味着编译后的可执行文件也不同。只要结果程序的行为符合c++标准所描述的,就允许对它进行任意的操作。这就是所谓的假设规则。由于您给出的两个示例代码根据标准具有完全相同的行为,编译器可能会将它们编译为相同的可执行文件。
不,一点也不。值得怀疑的是,任何编译器都会为这些生成不同的代码。
就语言而言,这两个结构是相同的。生成的代码也应该相同。
相关文章:
- 在 C++ 中的 if-else if- else 语句期间更改变量
- 如何改进一堆在已知值范围内评估变量的 else-if 条件?
- 我需要把 constexpr 放在 else-if 之后吗?
- 我们可以在第一个else-if条件结束后使用另一个else-if条件吗
- 如何在 C++17 中将 "else-if" 与初始值设定项一起使用?
- if, else if, else 函数未准确显示结果
- 使用 if/else if 的函数输出问题
- 需要消除这些"else if"并优化代码
- 不必要的 else 语句:当可以使用 IF 时,使用 ELSE IF 有什么缺点吗?
- MQL4:我的if/else if liop只有一半导致当前执行
- 如何在 else-if 语句中正确使用 or 语句 (||)
- if else-if else 语句 c++ 的替代项
- 具有"else if"方法问题 C++ 的基本计算器
- 如果/else-if语句将如何处理此操作
- If和else-If语句.它是如何在下面的代码中工作的
- 优化代码/实现"for"循环而不是长"if - else if - else"
- "if"块没有大括号,使后续"else if"嵌套
- 试图编写一个只使用if和else-if语句对两个数字进行排序的程序
- if else-if梯形图和编译器优化
- C++在else/if中声明一个优先级队列