什么是调度表?如何在 C 语言中实现它?



首先,我说我知道函数指针是如何工作的。 如果您想更详细地解释它们,请继续, 但是我问你的是我如何在调度中实现它们 使用 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 中使用调度表可能会更棘手。

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

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

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

最新更新