Frage

Ich dachte, ich hätte gehört, dass D-Klassen zwei Overhead-Wörter (2 void*) anstelle des von C++ benötigten einen Wortes haben.Ich habe auch gehört, dass das vtable-Layout nicht mit C++ kompatibel ist.Erinnere ich mich richtig?Wenn ja, was sind die Gründe für diese Entscheidungen?

War es hilfreich?

Lösung

Ein paar Dinge:

  1. In C++ hat eine Klasse keine virtuellen Funktionen null Overhead.
  2. In D erbt eine Klasse immer virtuelle Funktionen von Object, also hat es das immer __vptr Overhead, hat aber auch eine __monitor, die C++-Klassenobjekte nicht haben.
  3. Sowohl in C++ als auch in D wird es zusätzliche geben vptr für jede Schnittstelle, die die Klasse implementiert.

Das vtable-Layout ist nicht mit C++ kompatibel, da D einen Zeiger auf a enthält TypeInfo Instanz, die Laufzeittypinformationen über die Klasse enthält.C++ hat das offensichtlich nicht, daher ist es inkompatibel.

Andere Tipps

Der zusätzliche Zeiger ist auf ein Monitorobjekt für synchronisierte Klassen (es hat anscheinend darüber gesprochen, dass er es für nicht synchronisierte Klassen entfernt, aber das ist nicht passiert).Das Layout ist in der abi Abschnitt der Spezifikation dokumentiert.

Ich bin nicht sicher, wie sich das Vtable-Layout von der M-C ++-Compiler unterscheidet.Jemand anderes kann das wahrscheinlich antworten.

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