c / expert
Snippet
Dynamische Operationsverteilung über Funktionszeiger-Sprungtabellen-Matrix
Dieses Beispiel zeigt eine performante Sprungtabelle (Jump Table) unter Einsatz von C99 Designated Initializers mit Funktionszeigern. Der direkte Zugriff über den Array-Index ersetzt bedingte Verzweigungsketten durch eine O(1) Funktionssuche in fester Laufzeit.
snippet.c
c
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include <stdio.h>typedef enum {OP_ADD,OP_SUB,OP_MUL,OP_COUNT} OpCode;typedef int (*OpHandler)(int, int);static int exec_add(int a, int b) { return a + b; }static int exec_sub(int a, int b) { return a - b; }static int exec_mul(int a, int b) { return a * b; }static const OpHandler JUMP_TABLE[OP_COUNT] = {[OP_ADD] = exec_add,[OP_SUB] = exec_sub,[OP_MUL] = exec_mul};int dispatch_op(OpCode code, int operand1, int operand2) {if (code < 0 || code >= OP_COUNT) {return 0;}return JUMP_TABLE[code](operand1, operand2);}
Erklärung
1
typedef int (*OpHandler)(int, int);
Definiert einen Funktionszeiger-Typ als Signatur für die Handler-Routinen.
2
[OP_ADD] = exec_add,
Verwendet C99 Designated Initializer, um Opcode-Werte explizit Handlern zuzuordnen.
3
if (code < 0 || code >= OP_COUNT) {
Validiert Grenzen, um ungültigen Pufferzugriff vor der Tabellendereferenzierung zu verhindern.
4
return JUMP_TABLE[code](operand1, operand2);
Führt den Funktionsaufruf dynamisch über eine direkte Sprungtabellenabfrage in O(1) aus.