switch语句如何直接跳转到正确的内存位置?使用嵌套的if语句,它必须对每个语句进行比较,但是使用switch语句,它可以直接跳转到正确的case。这是如何实现的?
switch语句如何直接跳转到正确的内存位置?使用嵌套的if语句,它必须对每个语句进行比较,但是使用switch语句,它可以直接跳转到正确的case。这是如何实现的?
有许多不同的方法可以将switch
语句编译成机器码。以下是其中一些方法:
编译器可以产生一系列测试,这并不像只需要log2(N)个测试就足以在N个可能情况之间派发值。
编译器可以生成值和跳转地址的表格,这将由通用查找代码(线性或二叉查找,类似于bsearch()
)使用,最终跳转到相应的位置。
如果案例值足够密集,则编译器可以生成跳转地址表和代码,检查开关值是否在涵盖所有案例值的范围内,并直接跳转到相应的地址。这可能是与您描述最接近的实现:但使用switch语句会直接跳转到正确的案例。
根据目标CPU的特定能力、编译器设置以及案例值的数量和分布,编译器可能使用上述方法之一或另一种方法,或其中某些方法的组合,甚至可能使用其他方法。
编译器设计者花费大量精力来尝试改进这些选择的启发式算法。查看汇编输出或使用在线工具(例如Godbolt的编译器资源管理器)来查看各种代码生成可能性。
if
却不是?请提供标准支持你的说法。 - too honest for this site