在以下文档中,第4-5页:
http://www.open-std.org/jtc1/sc22/wg21/docs/ESC_Boston_01_304_paper.pdf
typedef int (* jumpfnct)(void * param);
static int CaseError(void * param)
{
return -1;
}
static jumpfnct const jumptable[] =
{
CaseError, CaseError, ...
.
.
.
Case44, CaseError, ...
.
.
.
CaseError, Case255
};
result = index <= 0xFF ? jumptable[index](param) : -1;
它正在比较IF-ELSE与SWITCH,然后介绍了此“跳转表”。显然,这是三者中最快的实现。到底是什么我看不到它如何工作?
最佳答案
跳转表是一种将某些输入整数映射到 Action 的方法。它源于可以将输入整数用作数组索引的事实。
该代码设置了一个指向函数的指针数组。输入的整数然后用于选择这些功能指针中的一个。通常,它看起来像是一个指向CaseError
函数的指针。但是,将不时地指出这一点。
如此设计
jumptable[62] = Case62;
jumptable[95] = Case95;
jumptable[35] = Case35;
jumptable[34] = CaseError; /* For example... and so it goes on */
因此,选择正确的函数进行调用是恒定时间...对于if-elses和selects,选择正确函数所需的时间取决于输入整数...假设编译器没有将select优化为a jumptable本身...如果它是针对嵌入式代码的,则有可能已禁用这种优化...您必须检查一下。
找到正确的功能指针后,最后一行会简单地调用它:
result = index <= 0xFF ? jumptable[index](param) : -1;
变成
result = index <= 0xFF /* Check that the index is within
the range of the jump table */
? jumptable[index](param) /* jumptable[index] selects a function
then it gets called with (param) */
: -1; /* If the index is out of range, set result to be -1
Personally, I think a better choice would be to call
CaseError(param) here */