【问题标题】:How Switch Statement WorksSwitch 语句的工作原理
【发布时间】:2017-02-09 22:04:02
【问题描述】:

switch 语句如何立即放到内存中的正确位置?使用嵌套的 if 语句,它必须与每个语句进行比较,但使用 switch 语句,它直接转到正确的情况。这是如何实现的?

【问题讨论】:

  • 你的编译器可能有一个标志来显示它生成的汇编代码......剧透:通常它与一堆 if-s 差不多
  • 是什么让你认为它是这样的?而if 没有?请提供标准支持您的断言的参考。
  • @DavidConnolly:你能接受答案吗?

标签: c assembly switch-statement


【解决方案1】:

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

  • 编译器可以生成一系列测试,这并不是低效的,因为只有大约 log2(N) 个测试足以在N 种可能的情况。

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

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

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

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

【讨论】:

    猜你喜欢
    • 2020-02-26
    • 2021-10-31
    • 2016-09-19
    • 2019-01-22
    • 1970-01-01
    • 2012-03-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多