分支表
外观
(重定向自跳躍表)
此条目目前正依照其他维基百科上的内容进行翻译。 (2025年1月24日) |
程序设计中的分支表(branch table)或跳跃表(jump table)是一种利用表格来转移程控权(分支)的方式,表格中的内容就是对应的分支指令。这属于多路分支。若使用汇编语言撰写程式,常会用到分支表,不过也可能是由编译器产生,特别是实现最佳化的switch指令,且其数值很相近的情形[1]。
典型的实现
[编辑]分支表包括许多的分支指令,而分支到这些分支指令的方式是是用其序列索引乘以分支指令长度当作分支指令的偏移量,此作法的原因是机器语言的分支指令长度是固定的,而且若原始资料很容易转换为序列索引值,此方式特别有效。此方式包括三个步骤:
- 可能会做输入资料的数据确认,确认资料是正确可接受的(若输入资料是字节,而且已有256个元素的转换表,直接求得以下的偏移量,此步骤可以和第二步骤合并,不会有额外运算)。若很确定输入资料都正确,也可以省略此步骤。
- 将资料转换为分支表中会用到的偏移量,可能会用到乘法或是位操作(乘以二的次方,速度较快),要乘的数则视分支指令长度而定。若使用静态的转换表,也可以在转换表编译时就将乘法考虑进去,以避免重复的运算。
- 用分支表的基底位置加上偏移量,分支到计算出来的位置。这会用在程式计数器加上偏移量的加法(也有可能有些指令集架构下,分支指令会使用特殊的索引暂存器。最后的位置会指向分支表中分支到某程式的指令。
以下的伪代码说明此概念
... validate x /* transform x to 0 (invalid) or 1,2,3, according to value..) */
y = x * 4; /* multiply by branch instruction length (e.g. 4 ) */
goto next + y; /* branch into 'table' of branch instructions */
/* start of branch table */
next: goto codebad; /* x= 0 (invalid) */
goto codeone; /* x= 1 */
goto codetwo; /* x= 2 */
... rest of branch table
codebad: /* deal with invalid input */
相关条目
[编辑]- 分派表,分支表的另一个名称,用在迟绑定时。
- 函数指针阵列,也可以用作分支表。
- 间接分支
- 查找表
- Switch指令,高阶语言中的条件指令,可以产生分支表。
- 虚拟方法表,另一种跳跃表的名称,动态分派函式指标。
参考资料
[编辑]- ^ Page, Daniel. A Practical Introduction to Computer Architecture. Springer Science & Business Media. 2009: 479. ISBN 9781848822559.
外部链接
[编辑]- [1] Examples of, and arguments for, Jump Tables via Function Pointer Arrays in C/C++
- [2] (页面存档备份,存于互联网档案馆) Example code generated by 'Switch/Case' branch table in C, versus IF/ELSE.
- [3] (页面存档备份,存于互联网档案馆) Example code generated for array indexing if structure size is divisible by powers of 2 or otherwise.
- [4] (页面存档备份,存于互联网档案馆) "Arrays of Pointers to Functions" by Nigel Jones