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)仍然可以做同样的事情,如果编译器可以告诉 xif 子句之间没有变化(通常是这种情况,除非xvolatile 或其他东西)。

【讨论】:

【参考方案3】:

还要注意,如果您知道某些情况比其他情况更有可能发生,那么 if/else 结构会更有效。

【讨论】:

但是开关盒也是订购的,不是吗? 我不知道是否所有编译器都保证排序。此外,编译器可能会创建一个跳转表——当这比 if/else 效率更高或更低时,留给读者练习。 不应该作为评论发布吗?

以上是关于switch case vs if else [重复]的主要内容,如果未能解决你的问题,请参考以下文章

if else和switch case那个效率更高一点

switch...case 与 if...else 的性能分析

消除代码中的 if-else/switch-case

分支语句 if...else switch..case...break

switch语句和switch-case与if-else之间的转换

“else if”比“switch() case”快吗? [复制]