我一直在尝试了解什么是跳转表,但我无法理解某些内容。从我看到的许多示例中,它们似乎几乎可以归结为这一点,或者至少这是它的一个版本:
void func1() {};
void func2() {};
void func3() {};
int main()
{
void(*jumpTo[3])(void) = { func1, func2, func3 };
jumpTo[1]();
return 0;
}
这些似乎只是一个函数指针数组,由某个值/位置索引。那么跳转表是否只是索引函数指针数组?我对此非常好奇,因为我看到很多人说 switch 语句经常被编译到跳转表中作为性能指标。据我了解,通过以这种方式跳转到函数,它涉及指针取消引用和函数调用。我认为这两个对性能都不是很好。
该站点上的另一个答案说,通过这种方式“您正在添加一个 switch 语句不一定具有的函数调用开销。” 编译为跳转表的开关如何避免函数调用?
此外,这里有一个高度投票的答案说“跳转表可以是指向函数的指针数组或机器代码跳转指令数组。” 您将如何跳转到机器代码指令而不是取消引用指针?这更快吗?
两者之间的区别是在我上面的示例中,指针不必被取消引用,因为它可以被静态绑定?与在运行时传入随机数作为索引相反?
谢谢。