Switch case语句如何实现或在内部工作?

我在某处读到了switch语句使用“二进制搜索”或一些排序技术来精确选择正确的情况,与else-if梯形图相比,这增加了它的性能。

如果我们按顺序给出案例,那么交换机的工作速度会更快吗? 是这样吗? 你能在这个问题上添加宝贵的建议吗?

我们在这里讨论了相同的问题并计划发布作为一个问题。

实际上,编译器如何在代码中实现switch语句。

但是,我的理解是,当它适合时(即相对密集的情况),使用跳转表。

这意味着:

 switch(i) { case 0: doZero(); break; case 1: doOne(); case 2: doTwo(); break; default: doDefault(); } 

最终会被编译成类似的东西(可怕的伪assembly器,但我希望它应该很清楚)。

 load i into REG compare REG to 2 if greater, jmp to DEFAULT compare REG to 0 if less jmp to DEFAULT jmp to table[REG] data table ZERO ONE TWO end data ZERO: call doZero jmp END ONE: call doOne TWO: call doTwo jmp END DEFAULT: call doDefault END: 

如果不是这种情况,那么还有其他可能的实现允许某种程度的“优于一系列条件”。

如何实施swtich取决于你拥有的价值观。 对于范围内接近的值,编译器通常会生成跳转表。 如果值相距很远,它将生成一个链接分支,使用二进制搜索等方法来查找正确的值。

这样的switch语句的顺序无关紧要,无论你是按升序,降序还是随机顺序,它都会做同样的事情 – 做一些关于你想做什么最有意义的事情。

如果没有别的,切换通常比if-else序列更容易阅读。

在一些谷歌搜索我发现一些兴趣链接,并计划发布作为我的问题的答案。 http://www.codeproject.com/Articles/100473/Something-You-May-Not-Know-About-the-Switch-Statem

欢迎评论..