Frage

Ich habe einige Artikel über die Netto-Lesung in Bezug auf Vtable Thunks und ich habe irgendwo gelesen, dass Thunks verwendet werden kann / Kette Verfahren Anrufe einzuhaken.

Ist es erreichbar?

Wer weiß, wie das funktioniert, auch in der Lage bin ich nicht gute Ressource zu erklären Thunks zu finden. Irgendwelche Vorschläge für das?

War es hilfreich?

Lösung

ein rohes thunk im Stil der V-Tabelle Thunks Implementierung ist ein letzter Ausweg. Was auch immer müssen Sie erreichen höchstwahrscheinlich mit einer Wrapper-Funktion erreicht werden, und es wird viel weniger schmerzhaft sein.

Im Allgemeinen ist ein Thunk führt Folgendes aus:

  1. die Eingangsparameter Fix up (zum Beispiel konvertieren in ein anderes Format)
  2. Rufen Sie die reale Umsetzung
  3. Bereinigen Schritt 1 / fixieren die Ausgangsparameter

Um ein Beispiel zu sehen, wie es funktioniert, wenden sie sich an unseren guten Freund Raymond Chen und seine Diskussion Teller Thunks:

http://blogs.msdn.com/oldnewthing /archive/2004/02/06/68695.aspx

Die Thunk er wurde wie folgt verwendet:

[thunk]:CSample::QueryInterface`adjustor{4}':
  sub     DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
  jmp     CSample::QueryInterface

Als er beschreibt, Sie haben eine Klasse, die die gleichen Methoden über mehrere Schnittstellen implementiert, so hat es mehrere V-Tabellen. (Wenn Sie nicht COM wissen, alles, was Sie wissen müssen, ist, dass es mit v-Tabellen arbeitet direkt, also ein Zeiger auf eine bestimmte Schnittstelle muss Funktionszeiger auf alle Methoden dieser Schnittstelle enthalten, um ).

Wenn Sie zwei Schnittstellen mit verschiedenen Methoden in einem bestimmten Schlitz implementieren, müssen Sie mehr V-Tabellen. Aber schreiben Sie nur die überlappenden Methoden einmal, so dass Verfahren in der Lage sein muss, sowohl mit „diesem“ Zeiger zu arbeiten. Um das zu tun, der Compiler ein Verfahren erzeugt, das die Korrektur erforderlich macht und ruft die ursprüngliche Implementierung.

Also, das Thunk führt die folgenden Schritte aus:

  1. die Eingangsparameter Fix, nämlich den verborgenen „dieses“ Zeiger, in der ersten Zeile.
  2. Rufen Sie die reale Umsetzung in der zweiten Zeile.
  3. Cleanup: keine erforderlich (siehe unten)

Dies ist, wo die jmp Anweisung kommt in. In der Regel, wenn Sie die Funktion call nennen, wäre es an Dich zurück, und man müßte zurück zu Ihrem Anrufer ret. Da es keine Bereinigung zu tun, führt der Compiler eine Optimierung, wo er die Ausführung direkt in der realen Umsetzung geht und lassen Sie sich die Anweisung return Rückkehr der realen Implementierung zu Ihre Anrufer. Dies ist nur eine Optimierung, nicht ein wesentlicher Bestandteil des Thunk. Beispielsweise 16/32-Bit-Thunk werden die Ein- / Ausgabeparameter zwischen 16 und 32 Bits als notwendig, wandeln so kann es den Bereinigungsschritt nicht überspringen; es muss call, nicht jmp.

Die Moral von der Geschichte ist: Wenn Sie etwas, wie die jmp Optimierung tun müssen, um, dass Sie nicht direkt in C schreiben können ++ oder Ihre andere High-Level-Sprache der Wahl, voran gehen und eine Assemblersprache thunk schreiben. Ansonsten nur einen Wrapper schreiben und mit ihm getan werden.

Ehrlich gesagt, es klingt wie Sie für die Performance-Optimierung sind gefragt, und die meiste Zeit (1) der Compiler ist besser zu optimieren, als wir denken, und (2) es wird dir nicht so groß von einer Verbesserung geben, wie Sie denken.

Andere Tipps

Nun, lesen Sie, dass Thunks eine Lösung ist, und nun suchen Sie ein Problem zu lösen?

Thunks, in der Regel sind kurze "Weiterleiten" Funktionen, die kleinere - in der Regel fest einprogrammiert -. Anpassungen

VTable Stücke sind sehr gut erklärt in wikipedia im Moment. Sie nutzen das gemeinsame Muster: eine kleine Funktion erzeugen, um Berechnungs- / zusätzliche Arbeit zur Laufzeit zu vermeiden

.

Andere Orte, die ich je gesehen habe / verwendet Thunks:

einen Fenstergriff mit einem Fensterobjekt zuordnen. Für jedes Fenster eine kleine thunk erzeugt im laufenden Betrieb, die die Fensterprozedur mit dem Objektverweis aufrufen, wird die Thunk dann verwendet als Fensterprozedur unterklassiert, wird

Delay Laden DLLs: die Thunk stellt sicher, dass die DLL das erste Mal geladen wird jede Funktion aufgerufen wird

.

Trapping COM-Schnittstelle ruft: die Thunks bieten eine Injektionsstelle für die Diagnose und dem eigentlichen Verfahren springen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top