在以下文档中,第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 */

10-07 15:20