c - 什么是调度表?我如何在 C 中实现它?

标签 c pointers function-pointers dispatch-table

首先让我说我知道函数指针是如何工作的。 如果您想更详细地解释它们,请继续, 但是我问你的是我怎样才能在调度中实现它们 使用 C 的表。

我已经搜索过什么是调度表,但没有真正搜索到 除了对它可能如何工作的模糊理解之外,什么都不理解。

请分享它的实际用途以及我如何创建自己的 C 中的调度表。非常感谢您的帮助。

最佳答案

调度表可以通过多种方式实现。一个是函数指针表:

int Add     (int a, int b) { return a + b; }
int Subtract(int a, int b) { return a - b; }
int Multiply(int a, int b) { return a * b; }
int Divide  (int a, int b) { return a / b; }


int DoFunction(int Select, int a, int b)
{
    /*  Declare a type to point to a function with parameters (int a, int b)
        and returning an int.
    */
    typedef int (*MyFunctionPointer)(int a, int b);

    //  Build a dispatch table with pointers to functions.
    MyFunctionPointer Table[] =
        {
            Add,
            Subtract,
            Multiply,
            Divide,
        };

    //  Dispatch to the requested function.
    return Table[Select](a, b);
}


#include <stdio.h>


int main(void)
{
    //  Demonstrate calls using dispatch table.
    printf("7 + 3 = %d.\n", DoFunction(0, 7, 3));
    printf("7 - 3 = %d.\n", DoFunction(1, 7, 3));
    printf("7 * 3 = %d.\n", DoFunction(2, 7, 3));
    printf("7 / 3 = %d.\n", DoFunction(3, 7, 3));
}

也可能会跳转到分支指令表。这在汇编语言中比在高级语言中更常见。

本质上,调度表是将程序控制转移到通过索引选择的位置的某种方法,而不是通过诸如 ifswitch 语句之类的单独选择。在某些情况下,计算索引以选择函数比编写一些复杂的选择语句更容易或更清晰。

(这个例子展示了同类函数——它们都有相同的参数类型列表和返回类型。如果函数不是同类的,在 C 中使用调度表可能会更棘手。)

虽然调度表在很多源代码中并不常见(也不罕见),但它们可以用于多种用途,例如:

  • 在一些处理器上,中断服务例程是通过调度表处理的:内存中有固定的位置存储例程的地址,形成一个地址表。当中断发生时,硬件查找地址并将控制权转移给它。

  • 在应该在各种硬件上具有高性能的代码中,我们可能会准备几个函数,每个函数都使用为特定硬件设计的不同算法。当程序启动时,它可以测试它在什么硬件上执行(例如特定的处理器型号)并将索引记录到表中。该索引将指示要执行的例程。然后调用该函数可以使用索引表进行快速调度,而不需要每次调用都测试和分支。

关于c - 什么是调度表?我如何在 C 中实现它?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62027943/

相关文章:

pointers - 垃圾引用和悬空引用有什么区别?

c++ - 模板类中 boost::unordered_map 中的 boost::tuple 出现问题

c - char * const 和 const char * 有什么区别?

c - MPI 生成 : root process does not communicate to child processes

c - C中的服务监听返回-1

c++ - 使用指向模板函数的指针时出现 VC++ 错误

c - c语言中函数指针的正确使用方法

c - 将结构体转换为 int 类型

c - `*&p` 与 `&*p` 之间的区别?

c - 重新分配二维数组 - valgrind 错误