【问题标题】:Difference between a lookup table and a jump table查找表和跳转表的区别
【发布时间】:2020-10-12 10:43:14
【问题描述】:

我知道jump tables主要用于在汇编中创建switch语句:

int a = 5;
switch (a){
  case 5:
  ...
   break;
  ...
} 

在这种情况下,跳转只是一个指向具有instructions 的内存地址的指针来执行case 5 的工作。

如果我没记错的话,lookup table 已经在数组中预先计算了结果?所以不是编写代码来计算它们,而是返回数组索引?有点像HashMap

以上两个听起来和我很相似,它们基本上是一样的吗?一个指向指令,另一个返回预先计算好的结果?

【问题讨论】:

  • 我认为跳转表是查找表的一个特例;包含分支指令的查找表。
  • 分店地址
  • C语言中没有像跳转表这样的东西,为什么你把它标记为C
  • @P__J__ 函数指针数组是一个跳转表。事实上,许多嵌入式系统将其中断向量表实现为一个用 C 语言编写的函数指针数组 - 由硬件调用的函数。
  • @P__J__ 不,它确实可以包含分支指令。

标签: c lookup-tables jump-table


【解决方案1】:

如果我没记错的话,查找表已经在数组中预先计算了结果?所以不是编写代码来计算它们,而是返回数组索引?有点像 HashMap。

正确。该索引处存储的内容可以是数据,也可以是指向数据的指针,或指向函数的指针等。

跳转表只是一个查找表,其中每个索引对应一个函数,在 C 中最常见的是作为函数指针数组实现。

【讨论】:

  • 那么在lookup tables 的情况下,有一张桌子开始有什么意义呢?代码不能只返回constant 而不是在表格中查找吗?或者是否有一种算法可以从表中获取并输入和输出一个值?类似于跳转表。
  • @Anthon 代码如何知道在没有表格的情况下返回哪个?你不能凭空存储这些信息。该表可能是应用程序数据的一部分,也可能是机器代码的一部分,但它仍然必须分配在某个地方。
【解决方案2】:

正如您所提到的,跳转表是本机代码,其排列方式很容易根据整数值跳转。如果跳转表只包含短跳转指令,您可以将您的开关值乘以 3,然后添加表中第一个条目的偏移量并跳转(JMPCALL)。

另一方面,查找表只是原始数据。它仍然以打包格式存储,因此您可以通过对索引 (size * index + offset) 的线性操作来访问它,但要使用它,您可以使用间接移动 (MOV dest, [expression]) 而不是物理跳转到它。

请记住,查找表只是一种优化,尽管它很大,您也可以使用跳转表将值加载到寄存器中。这是一个is-a关系。

【讨论】:

    【解决方案3】:

    幕后发生的事情是编译器。但你的观察是对的。这是一个 sn-p,演示了编译器通常对 switch 语句所做的事情:

    #include <stdio.h>
    
    void foo(void) { printf("foo\n"); }
    void bar(void) { printf("bar\n"); }
    
    int main(void)
    {
        // Array of size 2 of pointer to function without arguments returning void
        // Yes, declaring function pointers is not intuitive...
        void (*f[2])(void);
    
        f[0] = foo;
        f[1] = bar;
    
        int x;
        printf("Enter a number (0 or 1): ");
        scanf("%d", &x);
    
        printf("Using switch\n");
        switch(x) {
        case 0: foo(); break;
        case 1: bar(); break;
        }
    
        printf("Using array of function pointers\n");
        f[x]();
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-06-08
      相关资源
      最近更新 更多