簡體   English   中英

什么是調度表? 如何在 C 中實現它?

[英]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));
}

也可以跳轉到一個分支指令表。 這在匯編中比在高級語言中更常見。

本質上,調度表是一種將程序控制轉移到通過索引選擇的位置的方法,而不是通過單獨的選擇,例如ifswitch語句。 在某些情況下,計算 select 和 function 的索引比編寫一些復雜的選擇語句更容易或更簡潔。

(這個例子展示了同構函數——它們都具有相同的參數類型列表和返回類型。如果函數不是同構的,使用 C 中的調度表可能會比較棘手。)

盡管調度表在很多源代碼中並不常見(它們也並不罕見),但它們可以用於多種用途,例如:

  • 在某些處理器上,中斷服務程序是通過一個調度表來處理的:在 memory 中有固定的位置存儲例程的地址,形成一個地址表。 當發生中斷時,硬件會查找地址並將控制權轉移給它。

  • 在應該在各種硬件上具有高性能的代碼中,我們可能會准備幾個函數,每個函數都使用為特定硬件設計的不同算法。 當程序啟動時,它可以測試它正在執行的硬件(例如特定的處理器型號)並將索引記錄到表中。 該索引將指示要執行的例程。 然后對 function 的調用可以使用索引表進行快速調度,而無需為每個調用進行測試和分支。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM