关于c ++:switch case vs if else

switch case vs if else

本问题已经有最佳答案,请猛点这里访问。

我想知道以下代码编译到程序集中的方式是否有什么不同。我听说交换箱比其他的更有效,但是在这个例子中,我不太确定是否会是这样。

1
2
3
4
5
6
7
if(x==1){
...
}else if(x==2){
...
}else{
...
}

1
2
3
4
5
6
7
8
9
10
11
12
switch(x){
 case 1:
 ...
 break;

 case 2:
 ...
 break;

 default:
 ...
}


如果条目是连续的(或几乎是连续的),编译器有时会将开关转换为跳转表。或者理论上,它可以使用二进制搜索来查找案例,而不是线性的一系列测试,如果有大量案例的话,这将更快。

另一方面,没有什么能阻止编译器对转换为if/else的同一代码进行相同的优化。

因此,在一个好的编译器上,在某些情况下切换速度可能更快。在一个非常好的编译器上,它们是相同的。


也请注意,如果您知道某些情况比其他情况更可能发生,if/else构造可能更有效。


在这种特定的情况下,switch可以变成一个跳转表。如果编译程序能告诉xif子句之间没有变化(通常情况下,除非xvolatile或其他东西),那么if语句(如果你把你的=写成==的话)仍然可以做同样的事情。