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
欢迎评论..