switch case vs if else [重复]
Posted
技术标签:
【中文标题】switch case vs if else [重复]【英文标题】:switch case vs if else [duplicate] 【发布时间】:2008-10-12 18:12:27 【问题描述】:我想知道以下代码编译成程序集的方式是否有任何不同。我听说 switch-case 比 if else 更有效,但在这个例子中我不太确定是否会这样。
if(x==1)
...
else if(x==2)
...
else
...
和
switch(x)
case 1:
...
break;
case 2:
...
break;
default:
...
【问题讨论】:
您是否考虑过让编译器发出汇编程序并比较生成的代码? 对我来说应该避免使用 swich-case 并改用 hash(关联数组)。它更干净。 在这里找到了一个很好的讨论:***.com/questions/1028437/… 不喜欢空间,对吧? ;) 【参考方案1】:如果条目是连续的(或几乎如此),编译器有时会将开关转换为跳转表。或者理论上可以使用二分搜索来查找案例,而不是线性系列测试,如果您有大量案例,这会更快。
另一方面,没有什么可以阻止编译器对转换为 if/else 的相同代码进行相同的优化。
所以在一个好的编译器上,切换在某些情况下会更快。在一个非常好的编译器上,它们是一样的。
【讨论】:
【参考方案2】:在这个特定的情况下,switch
可以变成一个跳转表。 if
语句(如果您将 =
写为 ==
:-P)仍然可以做同样的事情,如果编译器可以告诉 x
在 if
子句之间没有变化(通常是这种情况,除非x
是volatile
或其他东西)。
【讨论】:
【参考方案3】:还要注意,如果您知道某些情况比其他情况更有可能发生,那么 if/else 结构会更有效。
【讨论】:
但是开关盒也是订购的,不是吗? 我不知道是否所有编译器都保证排序。此外,编译器可能会创建一个跳转表——当这比 if/else 效率更高或更低时,留给读者练习。 不应该作为评论发布吗?以上是关于switch case vs if else [重复]的主要内容,如果未能解决你的问题,请参考以下文章
switch...case 与 if...else 的性能分析
分支语句 if...else switch..case...break