switch case vs if else

switch case vs if else

本文关键字:else if vs case switch      更新时间:2023-10-16

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

if(x==1){
...
}else if(x==2){
...
}else{
...
}

switch(x){
 case 1:
 ...
 break;
 case 2:
 ...
 break;
 default:
 ...
}

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

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

因此,在一个好的编译器上,在某些情况下切换会更快。在一个非常好的编译器上,它们是一样的。

这种特定情况下,switch可以变成一个跳转表。如果编译器可以判断xif子句之间没有变化(通常情况下,除非xvolatile或其他什么),那么if语句(如果您将=写成==:-P)仍然可以做同样的事情。

请注意,如果您知道某些情况比其他情况更有可能,那么if/else构造可能会更高效。