Virtuelle Tabelle / Versandtabelle

8

Soweit ich weiß, hat jede Klasse ihre eigene vtable.

Jedoch dieser Wikipedia-Link erwähnt:

  

Die Versandtabelle eines Objekts wird   enthält die Adressen der Objekte   dynamisch gebundene Methoden. Methode   Anrufe werden durch Abrufen der   Adresse der Methode aus dem Objekt   Versandtabelle Die Versandtabelle ist   das gleiche für alle Objekte, die zu   die gleiche Klasse und ist deshalb   normalerweise zwischen ihnen geteilt.

Kann jemand bitte etwas Licht geben?

Danke!

    
codeObserver 07.07.2011, 06:06
quelle

4 Antworten

10

Manchmal ist es einfacher mit einem Beispiel zu verstehen:

%Vor%

Bei einem Objekt vom Typ Derived könnte es also so aussehen:

%Vor%

Bei der Vtable für den Typ "Derived" sieht das so aus:

%Vor%

Beachten Sie, dass "methodC" nicht virtuell ist und nicht in der vtable enthalten ist. Beachten Sie außerdem, dass alle Instanzen der abgeleiteten Klasse einen vtable-Zeiger auf dasselbe gemeinsame vtable-Objekt haben (da sie den gleichen Typ haben).

Obwohl die Implementierungen für C ++ und Java etwas anders sind, sind die Ideen nicht inkompatibel. Der wesentliche Unterschied besteht darin, dass Java-Methoden "virtuell" sind, sofern sie nicht als "endgültig" deklariert werden. In C ++ muss das Schlüsselwort "virtual" explizit für die Funktion in der vtable angegeben werden. Alles, was nicht in der vtable ist, wird mit den Kompilierzeittypen anstelle des Laufzeittyps des Objekts ausgelöst.

    
Michael Aaron Safyan 07.07.2011 06:21
quelle
4

Ja, virtuelle Methoden werden vom Compiler und der Laufzeit unterschiedlich behandelt.

Java: Alle Methoden in Java sind standardmäßig virtuell. Das bedeutet, dass jede Methode bei der Vererbung überschrieben werden kann, es sei denn, diese Methode wird als final oder statisch deklariert.

Aus der VM-Spezifikation

  

Die Java Virtual Machine nicht   Mandat jede besondere interne   Struktur für Objekte. Das Buchzeichen   Dort steht: In einigen von Suns   Implementierungen des Java Virtual   Maschine, ein Verweis auf eine Klasse   Instanz ist ein Zeiger auf ein Handle, das   ist selbst ein Paar Zeiger: eins zu a   Tabelle mit den Methoden der   Objekt und ein Zeiger auf die Klasse   Objekt, das den Typ des darstellt   Objekt und das andere zum Speicher   aus dem Heap für das Objekt zugewiesen   Daten.

C ++:

Wenn eine Klassenmemberfunktion als virtuell deklariert wird, erstellt der Compiler eine virtuelle Tabelle im Speicher, die alle Funktionszeiger enthält, die als deklariert sind virtuell in dieser Klasse. Dies ermöglicht einen Laufzeitpolymorphismus (d. H. Das Herausfinden des gewünschten Funktion zur Laufzeit). Virtuelle Funktionstabellen haben zusätzlich einen zusätzlichen Zeiger in der Objekt an die V-Tabelle. Da dieser zusätzliche Zeiger und die Vtable die Größe von Das Objekt, ein Klassen-Designer muss vernünftig sein, Funktionen virtuell deklarieren.

Die Reihenfolge der Ereignisse beim Aufruf einer Methode für den Basisobjekt-Zeiger lautet:

  • Hole den Vtable-Zeiger (dieser Vtable-Zeiger zeigt auf den Anfang der Vtable).
  • Ermittelt die Funktionszeiger in der vtable mit Offset.

Rufen Sie die Funktion indirekt über den vtable-Zeiger auf.

    
Javascript is GOD 07.07.2011 06:07
quelle
2

Jede Klasse mit virtuellen Funktionen (d. h. in Java ist es nur "jede Klasse") hat ihre eigene vtable . Jedes Objekt hat einen Verweis auf seine Klasse vtable versteckt. Objekte derselben Klasse haben also identische Referenzen.

Wenn Sie eine virtuelle Methode aufrufen, führt der Compiler normalerweise eine Suche durch:

%Vor%

wird in etwas übersetzt

%Vor%

Manchmal kann der Compiler, wenn er einen bestimmten Objekttyp ableiten kann, einen statischen Aufruf anstelle von virtuell ausgeben. Also, Code

%Vor%

kann in

übersetzt werden %Vor%

Dies wird normalerweise schneller als ein virtueller Anruf ausgeführt.

    
elder_george 07.07.2011 06:19
quelle
0

Dieses Zitat weist darauf hin, dass jedes Objekt eine Dispatch-Tabelle hat, die unter der Klasse geteilt werden kann, da sie für alle Instanzen derselben Klasse gleich sind. I.E. Jede Klasse hat ihre eigene vtable.

    
Jim Deville 07.07.2011 06:11
quelle

Tags und Links