2016-04-27 13 views
1

zur Funktion Ich habe einen folgenden Code Basissystem auf meinem PC (x86) zu emulieren:Lookup-Tabelle Zeiger Array C++ Leistung

typedef void (*op_fn)(); 

void add() 
{ 
    //add Opcode 
    //fetch next opcode 
    opcodes[opcode](); 
} 

void nop() 
{ 
    //NOP opcode 
    //fetch next opcode 
    opcodes[opcode](); 
} 

const op_fn opcodes[256] = 
{ 
    add, 
    nop, 
    etc... 
}; 

und ich nenne den „Tisch“ über opcodes[opcode]() Ich versuche, die Leistung zu verbessern von meinem Dolmetscher. Was ist jede Funktion, wie

inline void add() 
inline void nop() 

inlining Gibt es irgendwelche Vorteile, es zu tun?

Gibt es trotzdem etwas schneller? Danke

+0

Frage zu Arbeitscode sind vielleicht besser für http://codereview.stackexchange.com/ – user463035818

+1

Können Sie ein Spielzeug Beispiel für tatsächlichen Arbeitscode erstellen, die Ihrem Muster entspricht? Sogar mit 3 Opcodes? Wie geschrieben, können große Leistungsprobleme durch Ihren Pseudo-Code verborgen werden. Auch "mach es besser" ist eine schlechte Frage; explizite Möglichkeiten, wie der Code fehlschlägt, ist besser, oder warum etwas unerwartet ist. – Yakk

+0

@ tobi303 Dies ist ein Beispiel/Pseudo-Code, der bei Code Review nicht im Fokus steht. Auf dieser Site benötigen wir echten, funktionierenden Code. Siehe [Eine Anleitung zur Code-Überprüfung für Stack-Overflow-Benutzer] (http://meta.codereview.stackexchange.com/questions/5777/a-guide-to-code-review-for-stack-overflow-users) – Phrancis

Antwort

3

Nur weil Sie eine Methode als inline kennzeichnen, erfordert es nicht den Compiler, dies zu tun - es ist eher ein Hinweis als eine Bestellung.

Vorausgesetzt, dass Sie die Opcode-Handler in einem Array speichern, muss der Compiler die Adresse der Funktion in das Array einfügen, daher kann sie nicht inline eingebunden werden.

Es ist eigentlich nichts falsch mit Ihrem Ansatz. Wenn du wirklich denkst, dass du Probleme mit der Leistung hast, dann hol dir ein paar Metriken, ansonsten mach dir keine Sorgen (an diesem Punkt!). Das Konzept einer Tabelle von Zeigern auf Funktionen ist nichts Neues - es ist tatsächlich, wie C++ virtuelle Funktionen implementiert (dh die V-Tabelle).

+0

@JoshKelley - danke! Das habe ich korrigiert. – Sean

2

"Inline" bedeutet "keinen Funktionsaufruf ausgeben, stattdessen den Funktionskörper zur Kompilierzeit ersetzen."

Aufruf über einen Funktionszeiger bedeutet "einen Funktionsaufruf ausführen, dessen Details bis zur Laufzeit nicht bekannt sind."

Die beiden Merkmale sind grundsätzlich entgegengesetzt. (Das Beste, auf das Sie hoffen können, ist, dass ein ausreichend fortgeschrittener Compiler statisch ermitteln könnte, welche Funktion in einem sehr eingeschränkten Fall über einen Funktionszeiger aufgerufen wird.)

switch Blöcke werden normalerweise als Sprungtabellen implementiert weniger Overhead als Funktionsaufrufe, also kann das Ersetzen des Funktionszeigerarrays durch einen switch Block und das Verwenden von Inline einen Unterschied machen.

1

inline ist nur ein Hinweis auf Ihren Compiler, es garantiert nicht, dass Inlining durchgeführt wird. Sie sollten in Inlining (vielleicht at the ISO C++ FAQ) nachlesen, da zu viel Inlining Ihren Code langsamer (durch Code Bloat und zugeordneten virtuellen Speicherabsturz) tatsächlich machen kann.