Jos*_*all 49
跳转表可以是指向函数的指针数组,也可以是机器代码跳转指令数组.如果您有一组相对静态的函数(例如系统调用或类的虚函数),那么您可以创建此表一次并使用数组中的简单索引调用函数.这意味着检索指针并调用函数或跳转到机器代码,具体取决于所使用的表的类型.
在嵌入式编程中执行此操作的好处是:
如果确实为访问表而花费了一点点性能,但这并不比任何其他虚函数调用差.
Ada*_*vis 23
跳转表,也称为分支表,是一系列指令,全部无条件地分支到代码中的另一个点.
您可以将它们视为切换所有案例的开关(或选择)语句:
MyJump(int c)
{
switch(state)
{
case 0:
goto func0label;
case 1:
goto func1label;
case 2:
goto func2label;
}
}
Run Code Online (Sandbox Code Playgroud)
请注意,没有返回 - 它跳转到的代码将执行返回,它将跳回到myjump被调用的任何地方.
这对于基于状态变量执行某些代码的状态机很有用.有许多其他用途,但这是主要用途之一.
它用于你不想浪费时间摆弄堆栈,并希望节省代码空间.它尤其适用于速度非常重要的中断处理程序,导致中断的外设只能由单个变量知道.这类似于具有中断控制器的处理器中的向量表.
一个用途是使用0.60美元的微控制器并为视频应用生成复合(TV)信号.micro并不强大 - 实际上它只是写入每条扫描线的速度还不够快.跳转表将用于绘制字符,因为从内存加载位图需要太长时间,并使用for()循环将位图移出.而是单独跳转到字母和扫描线,然后是大约8个实际将数据直接写入端口的指令.
-亚当
跳转表通常(但不限于)用在有限状态机中,以使其成为数据驱动的。
而不是嵌套的 switch/case
switch (state)
case A:
switch (event):
case e1: ....
case e2: ....
case B:
switch (event):
case e3: ....
case e1: ....
Run Code Online (Sandbox Code Playgroud)
你可以创建一个二维数组或函数指针,然后调用handleEvent[state][event]