我想知道以下代码编译成程序集的方式是否有任何不同。我听说switch-case比其他情况更有效,但在这个例子中我不太确定是否会出现这种情况。
if(x==1){
...
}else if(x==2){
...
}else{
...
}
和
switch(x){
case 1:
...
break;
case 2:
...
break;
default:
...
}
答案 0 :(得分:9)
如果条目是连续的(或几乎是这样),编译器有时会将开关转换为跳转表。或者它理论上可以使用二进制搜索来查找案例而不是线性系列测试,如果您有大量案例,这将更快。
另一方面,没有什么能阻止编译器对转换为if / else的相同代码进行相同的优化。
所以在一个好的编译器上,在某些情况下切换速度会更快。在一个非常好的编译器上,它们是相同的。
答案 1 :(得分:3)
另请注意,如果您知道某些案例比其他案例更有可能,则if / else构造可以更有效。
答案 2 :(得分:2)
在此特定情况下,switch
可以转换为跳转表。 if
语句(如果你将=
写为==
:-P)仍然可以做同样的事情,如果编译器可以告诉x
之间没有变化if
条款(通常情况属于这种情况,除非x
为volatile
或其他内容。)