Ham*_*rem 3 c pointers function-pointers dispatch-table
首先我要说的是我知道函数指针是如何工作的。如果您想更详细地解释它们,请继续,但是我问您的是如何使用 C 在调度表中实现它们。
我已经搜索过调度表是什么,但除了对它如何工作的模糊理解之外,我并没有真正理解任何东西。
请分享它的实际用途以及我如何用 C 创建我自己的调度表。非常感谢帮助。
调度表可以通过多种方式实现。一种是函数指针表:
\n\nint Add (int a, int b) { return a + b; }\nint Subtract(int a, int b) { return a - b; }\nint Multiply(int a, int b) { return a * b; }\nint Divide (int a, int b) { return a / b; }\n\n\nint DoFunction(int Select, int a, int b)\n{\n /* Declare a type to point to a function with parameters (int a, int b)\n and returning an int.\n */\n typedef int (*MyFunctionPointer)(int a, int b);\n\n // Build a dispatch table with pointers to functions.\n MyFunctionPointer Table[] =\n {\n Add,\n Subtract,\n Multiply,\n Divide,\n };\n\n // Dispatch to the requested function.\n return Table[Select](a, b);\n}\n\n\n#include <stdio.h>\n\n\nint main(void)\n{\n // Demonstrate calls using dispatch table.\n printf("7 + 3 = %d.\\n", DoFunction(0, 7, 3));\n printf("7 - 3 = %d.\\n", DoFunction(1, 7, 3));\n printf("7 * 3 = %d.\\n", DoFunction(2, 7, 3));\n printf("7 / 3 = %d.\\n", DoFunction(3, 7, 3));\n}\nRun Code Online (Sandbox Code Playgroud)\n\n人们还可以跳转到分支指令表。这在汇编中比在高级语言中更常见。
\n\n本质上,调度表是一种将程序控制转移到通过索引选择的位置的方法,而不是通过诸如 withif或switch语句之类的单独选择。在某些情况下,计算索引来选择函数比编写一些复杂的选择语句更容易或更清晰。
(此示例显示同构函数\xe2\x80\x94,它们都具有相同的参数类型列表和返回类型。如果函数不是同构的,则在 C 中使用调度表可能会更棘手。)
\n\n尽管调度表在很多源代码中并不常见(也并不罕见),但它们可以用于多种用途,例如:
\n\n在某些处理器上,中断服务例程是通过调度表处理的:内存中有固定的位置,用于存储例程的地址,形成地址表。当中断发生时,硬件查找地址并将控制权转移给它。
在应该在各种硬件上具有高性能的代码中,我们可能会准备几个函数,每个函数都使用为特定硬件设计的不同算法。当程序启动时,它可以测试正在执行的硬件(例如特定的处理器型号)并将索引记录到表中。该索引将指示要执行哪个例程。然后,对该函数的调用可以使用索引表进行快速调度,而无需为每个调用进行测试和分支。