如何使用Switch语句

6

switch语句如何直接跳转到正确的内存位置?使用嵌套的if语句,它必须对每个语句进行比较,但是使用switch语句,它可以直接跳转到正确的case。这是如何实现的?


6
您的编译器可能有一个选项用于显示其生成的汇编代码......提示:通常它与一堆 if 语句差不多。 - John Hascall
1
你认为它是什么原因呢?而 if 却不是?请提供标准支持你的说法。 - too honest for this site
@DavidConnolly:你能否接受这个答案? - chqrlie
1个回答

15

有许多不同的方法可以将switch语句编译成机器码。以下是其中一些方法:

  • 编译器可以产生一系列测试,这并不像只需要log2(N)个测试就足以在N个可能情况之间派发值。

  • 编译器可以生成值和跳转地址的表格,这将由通用查找代码(线性或二叉查找,类似于bsearch())使用,最终跳转到相应的位置。

  • 如果案例值足够密集,则编译器可以生成跳转地址表和代码,检查开关值是否在涵盖所有案例值的范围内,并直接跳转到相应的地址。这可能是与您描述最接近的实现:但使用switch语句会直接跳转到正确的案例

根据目标CPU的特定能力、编译器设置以及案例值的数量和分布,编译器可能使用上述方法之一或另一种方法,或其中某些方法的组合,甚至可能使用其他方法。

编译器设计者花费大量精力来尝试改进这些选择的启发式算法。查看汇编输出或使用在线工具(例如Godbolt的编译器资源管理器)来查看各种代码生成可能性。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接