Frage

C ++ hat die Mehrfachvererbung. Die Implementierung von Mehrfachvererbung auf Baugruppenebene kann ziemlich kompliziert sein, aber es gibt gute Beschreibungen online auf dies, wie normalerweise getan (vtables, Zeiger fixups, Thunks, etc).

Java hat nicht mehrere Implementierungsvererbung, aber es hat mehrere Schnittstellenvererbung, so dass ich, daß das Gerät nicht eine straight forward-Implementierung mit einem einzigen VTable pro Klasse denken kann. Wie funktioniert Java-Schnittstellen intern zu implementieren?

ich, dass im Gegensatz zu C realisieren ++, Java ist Jit zusammengestellt, so verschiedene Teile des Codes möglicherweise anders optimiert werden, und unterschiedliche JVMs könnten die Dinge anders tun. So gibt es einige allgemeine Strategie, dass viele JVMs auf diese folgen, oder jemand die Implementierung in einer bestimmten JVM nicht kennt?

Auch oft JVMs devirtualize und Inline-Methodenaufrufe in diesem Fall gibt es keine vtables oder gleichwertig an alle Beteiligten, also ist es nicht sinnvoll, könnten über die tatsächlichen Montagesequenzen zu stellen, die virtuelle / Interface-Methodenaufrufe zu implementieren, aber ich nehme an, dass die meisten JVMs hält immer noch eine Art allgemeiner Darstellung der Klassen um zu verwenden, wenn sie nicht in der Lage sind, alles devirtualize. Ist diese Annahme falsch? Ist diese Darstellung Blick in irgendeiner Art und Weise wie ein C ++ Vtable? Wenn ja haben Schnittstellen getrennt vtables und wie werden diese mit Klasse vtables verknüpft? Wenn kann so Objektinstanzen mehrere VTable-Zeiger haben (Klasse / Schnittstelle vtables) wie Objektinstanzen in C ++ kann? Referenzen eines Klassentyps und einem Schnittstellentyp auf das gleiche Objekt immer den gleichen Binärwert oder können diese unterscheiden sich wie in C ++, wo sie Zeiger fixups benötigen?

(Referenz: diese Frage ähnlich etwas fragt über die CLR, und es scheint eine gute Erklärung in diesem MSDN-Artikel auf < obwohl / a>, die inzwischen veraltet sein können. ich habe nicht in der Lage gewesen, etwas ähnliches für Java zu finden.)

Edit:

  • I mean ‚Geräte‘ im Sinne, nicht im Sinne von „Java-Klasse Arraylist implementiert die Liste Schnittstelle“ „Wie funktionieren die GCC-Compiler Integer-Addition / Funktionsaufrufe / etc implementieren“.
  • Ich bin mir bewusst, wie dies funktioniert auf der JVM-Bytecode-Ebene, was ich will, zu wissen, welche Art von Code und Datenstrukturen von der JVM erzeugt werden, nachdem es getan Laden ist die Klassendateien und die Erstellung der Bytecode.
War es hilfreich?

Lösung

Das Hauptmerkmal des HotSpot JVM ist Inline-Caching . Dies bedeutet nicht, tatsächlich, dass die Zielmethode inlined, sondern bedeutet, dass eine Annahme wird in den JIT-Code zu setzen, dass auf die virtuellen oder Interface-Methode jeder zukünftige Anrufziel wird die gleiche Implementierung (das heißt, dass der Anruf Ort monomorphic ist). In diesem Fall wird ein Überprüfung wird in den Maschinencode kompiliert, ob die Annahme tatsächlich hält (das heißt, ob der Typ des Zielobjekts ist die gleiche wie beim letzten Mal) war, und dann Übertragungssteuer direkt an die Zielmethode - ohne virtuelle an allen beteiligten Tabellen. Wenn die Behauptung fehlschlägt, kann versucht werden, diese Seite einer megamorphic Aufrufs zu konvertieren (das heißt mit mehreren möglichen Typen); wenn dies nicht gelingt auch (oder wenn es der erste Anruf), ein regelmäßiger langatmig Lookup durchgeführt wird, unter Verwendung von V-Tabellen (für virtuelle Methoden) und itables (für Schnittstellen).

Bearbeiten : Der Hotspot Wiki mehr Details über die vTable und ITable Stubs hat. In dem polymorphen Fall setzt es noch eine Inline-Cache-Version in die Aufrufstelle. Jedoch tatsächlich der Code ist ein Stub, führt ein Nachschlagen in einer vtable oder ein ITable. Es ist eine vtable Stub für jede vtable Offset (0, 1, 2, ...). Schnittstelle ruft eine lineare Suche über eine Reihe von itables hinzufügen, bevor die ITable Blick in (falls gefunden) in der angegebenen Offset.

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