Switch语句的工作原理

时间:2017-02-09 22:04:03

标签: c assembly switch-statement

switch语句如何立即下降到内存中的正确位置?对于嵌套的if语句,它必须与每个语句进行比较,但是使用switch语句它会直接转到正确的大小写。这是如何实现的?

1 个答案:

答案 0 :(得分:15)

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

  • 编译器可以生成一系列测试,这些测试效率不高,只有 log 2 (N)测试足以在其中调度一个值 N 可能的情况。

  • 编译器可以生成一个值表和跳转地址,然后由通用查找代码(线性或二分法,类似于bsearch())使用,最后跳转到相应的位置。 / p>

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

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

编译器设计人员花费了大量精力来尝试改进这些选择的启发式方法。查看汇编输出或使用Godbolt's Compiler Explorer等在线工具查看各种代码生成可能性。