切换案例vs if else

我想知道下面的代码编译成程序集的方式是否有任何不同。 我听说switch-case比if else更有效,但在这个例子中我不太确定是否会出现这种情况。

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

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

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

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

所以在一个好的编译器上,在某些情况下切换会更快。 在一个非常好的编译器上,它们是相同的。

另请注意,如果您知道某些案例比其他案例更有可能,则if / else构造可以更有效。

这种特定情况下,可以将switch转换为跳转表。 if语句(如果你编写你的= as == :-P)仍然可以做同样的事情,如果编译器可以告诉xif子句之间没有变化(通常是这种情况,除非xvolatile或者某种东西)。