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?
Lösung
Ein paar Dinge:
- In C++ hat eine Klasse keine virtuellen Funktionen null Overhead.
- 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. - 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.