In meinem Programm wird es einige Funktionen geben, die neben dem normalen Funktionsaufruf auch noch durch eine spezielle Funktion aufgerufen werden sollen. Diese Funktion hat einen "int" Parameter, der die Nummer der Funktion angibt. Mithilfe eines switch-case Blockes würde sich das erledigen lassen. Jedoch denke ich dass ein Array aus Funktionszeiger schneller zum Ziel führt. Aber wie bekomme ich ein solches Array am bessten initalisiert?
1 | typedef void (*pFunc)(int); |
2 | |
3 | void Func1(int); |
4 | void Func2(int); |
5 | |
6 | pFunc Arr[2] = {Func1, Func2}; |
7 | |
8 | void Func1(int a) |
9 | {
|
10 | //...
|
11 | }
|
12 | void Func2(int a) |
13 | {
|
14 | //...
|
15 | }
|
Oliver
Klaus3 wrote: > die Nummer der Funktion angibt. Mithilfe eines switch-case Blockes würde > sich das erledigen lassen. Jedoch denke ich dass ein Array aus > Funktionszeiger schneller zum Ziel führt. Man sollte den Compiler nicht unterschätzen. Der kriegt ziemlich gut raus, ab wann ne Sprungtabelle schneller ist und nimmt sie dann. Peter
Man sollte ihn auch nicht ueberschaetzen, ich habe schon einige Faelle erlebt, wo ein von Hand wegoptimiertes switch-case relevante Vorteile gebracht hat.
Ich hatte zuvor die Übergabe der Aufzurufenden Funktion per Zeiger auf diese Funktion. Eine switch-case Struktur führt zu definitiv viel mehr Code was sich nicht erklären lässt wenn man bedenkt dass nun nur noch 8-Bit Werte übergeben werden müssen. Ich vermute momentan dass vom Compiler diese switch-case Struktur (momentan ca 15 Einträge) nicht erkannt, oder nicht optimiert wird.
Der Compiler liefert oft auch eine LST-Datei (oder ähnlich), die den resultierenden Assembler-(Mnemonic)-Code inclusive der Original-Codezeilen als Kommentar enthält. Hier sieht man dann direkt, was der Compiler draus macht. Wenn das nicht gefällt, manuell kodieren. Christian
1 | typedef void (*pFunc)(int); |
2 | |
3 | void Func1(int); |
4 | void Func2(int); |
5 | |
6 | pFunc Arr[2] = {Func1, Func2}; |
7 | |
8 | void Func1(int a) |
9 | {
|
10 | //...
|
11 | }
|
12 | void Func2(int a) |
13 | {
|
14 | //...
|
15 | }
|
Aber wie findet nun der eigentliche Funktionsaufruf statt?
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.