Switch 底层执行原理
switch 底层执行原理
switch 语句根据一个整数索引值进行多重分支, 底层采用跳转表这种数据结构跳转表是一个数组, 表项 i 对应代码段的地址, 当 switch 索引值等于表项 i 时采取对应的程序操作
简单可理解为: 执行 switch 时生成一个长度为最大 case 常量+1 的数组, 程序首先判断 switch 变量是否大于最大 case 常量, 若大于, 则跳到 default 分支处理; 否则取得数组索引号为 switch 变量值大小, 取得数组对应值即为相应 case 代码块地址, 程序接着跳到此地址执行, 完成分支的跳转
但实际计算机底层实现这一操作会更加复杂一点, 以下参考深入理解操作机系统
图 a 是一个简单的 switch 例子, 对于 case 值有 100102~104106;case 值 102 与 104 是没有 break 语句结尾
图 b 是使用 C 语言的扩展形式来描述的, 每个表项都是一个代码块的地址 (指针), 这里的 && 指的就是 &
执行 switch 时, 会生成一张跳转表, 表项数为 (最大 case 值 - 最小 case 值+1), 跳转表是一个数组, 数组是一段连续的内存, jt 数组中包含了 7 个表项 (数组索引对应值), 每个都是指向对应代码块的指针
编译器将 switch 值 n - 最小 case 值 (100), 把取值范围移动到 0 至 6 之间, 创建出一个新的程序变量 index 首先判断 index 是否大于 6, 来判断是否在范围之外, 如果超出直接执行 default, 即 log_def 指针对应代码块
否则, 根据索引的值直接跳转不同位置