2017-02-09 169 views
6

switch语句如何立即下降到内存中的正确位置?嵌套的if语句必须与每个语句执行比较,但是使用switch语句直接转换为正确的语句。这是如何实施的?Switch语句如何工作

+6

你的编译器可能有一个标志来显示它生成的汇编代码...... Spoiler:通常它与大量if-s相同 –

+1

你认为它的作用是什么?而'if'不?请提供一个参考标准支持你的断言的地方。 – Olaf

+0

@DavidConnolly:你能接受答案吗? – chqrlie

回答

15

switch语句编译成机器码有很多不同的方法。这里有几个:

  • 编译器可产生一系列的测试,这是不那么低效的,因为只有大约日志(N)测试是足够派遣之间Ñ可能的值案例。

  • 编译器可以生成一个数值表和跳转地址表,这些数据表又将被通用查找代码(线性或二分类,类似于bsearch())使用,最后跳转到相应的位置。

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

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

编译器设计人员花费大量精力试图改进这些选择的启发式。查看程序集输出或使用在线工具(如Godbolt's Compiler Explorer)查看各种代码生成可能性。