[英]What is a dispatch table? How can I implement it in C?
首先讓我說我知道 function 指針是如何工作的。 如果您想更詳細地解釋它們,請提前 go,但是我問你的是如何使用 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));
}
也可以跳轉到一個分支指令表。 這在匯編中比在高級語言中更常見。
本質上,調度表是一種將程序控制轉移到通過索引選擇的位置的方法,而不是通過單獨的選擇,例如if
或switch
語句。 在某些情況下,計算 select 和 function 的索引比編寫一些復雜的選擇語句更容易或更簡潔。
(這個例子展示了同構函數——它們都具有相同的參數類型列表和返回類型。如果函數不是同構的,使用 C 中的調度表可能會比較棘手。)
盡管調度表在很多源代碼中並不常見(它們也並不罕見),但它們可以用於多種用途,例如:
在某些處理器上,中斷服務程序是通過一個調度表來處理的:在 memory 中有固定的位置存儲例程的地址,形成一個地址表。 當發生中斷時,硬件會查找地址並將控制權轉移給它。
在應該在各種硬件上具有高性能的代碼中,我們可能會准備幾個函數,每個函數都使用為特定硬件設計的不同算法。 當程序啟動時,它可以測試它正在執行的硬件(例如特定的處理器型號)並將索引記錄到表中。 該索引將指示要執行的例程。 然后對 function 的調用可以使用索引表進行快速調度,而無需為每個調用進行測試和分支。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.