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

时间:2012-12-28 09:45:52

标签: c++ c gcc if-statement switch-statement

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

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

我们讨论了here有关此问题并计划发布为问题。

4 个答案:

答案 0 :(得分:16)

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

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

这意味着:

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

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

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:

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

答案 1 :(得分:9)

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

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

如果不出意外,切换通常比if-else序列更容易阅读。

答案 2 :(得分:1)

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

欢迎评论..

答案 3 :(得分:0)

虽然它可以通过多种方式实现,但这取决于语言设计者想要如何实现它。 一种可能的有效方法是使用哈希映射 将每个条件(通常是整数)映射到要评估的相应表达式,然后是跳转语句。 其他解决方案也可能有效,因为 switch 通常具有有限条件,但有效的解决方案是使用哈希映射