Ein Objekt enthält Einträge für alle Felder sowie zusätzlichen Platz für einen Zeiger auf die virtuelle Methodentabelle. Die VMT enthält mehr als nur Zeiger für virtuelle Methoden. Ich erkläre more about the VMT auf meiner Website, einschließlich eines Diagramms.
Scheinbar führt Delphi 2009 zusätzlich zu dem VMT-Zeiger ein weiteres verstecktes Feld ein, um den Synchronisationsmonitor zu halten. Sie können bestimmen, ob sie am Anfang oder am Ende der Klasse mit einigem einfachen Code hinzugefügt wird:
type
TTest = class
FField: Integer;
end;
var
obj: TTest;
ObjAddr, FieldAddr: Cardinal;
begin
Assert(TTest.InstanceSize = 12);
obj := TTest.Create;
ObjAddr := Cardinal(obj);
FieldAddr := Cardinal(@(obj.FField));
writeln(FieldAddr - ObjAddr);
end.
Wenn es den Wert 4 druckt, wird der Monitor Feld am Ende des Objekts sein muss, weil 4 berücksichtigt nur die Größe des VMT-Pointers. Wenn der Wert 8 ausgegeben wird, muss das Monitorfeld neben dem VMT-Zeiger stehen.
Ich erwarte, dass Sie den Monitor am Anfang finden werden. Andernfalls bedeutet dies, dass das Layout des untergeordneten Objekts nicht einfach das Layout des Basisobjekts mit allen neuen angefügten Feldern ist. Dies würde bedeuten, dass der Offset des Monitorfelds vom Laufzeittyp des Objekts abhängt und dies die Implementierung komplizierter macht.
Wenn eine Klasse eine Schnittstelle implementiert, enthält das Objektlayout weitere ausgeblendete Felder. Die Felder enthalten Zeiger auf den Schnittstellenreferenzwert des Objekts. Wenn Sie einen IUnknown
Verweis auf ein Objekt haben, ist der Zeiger, den es hält, nicht derselbe wie der Zeiger auf das VMT-Feld des Objekts, was Sie mit einem gewöhnlichen Objektreferenz haben. Der Zeigerwert IUnknown
ist die Adresse des versteckten Feldes. Ich habe more about the layout of classes that implement interfaces geschrieben.
Das ist eigentlich das Gleiche. Die TClass-Referenz einer Klasse zeigt auf ihre VMT. Es sind also die gleichen 4 Bytes. Was sind die anderen 4? –
(Es ist erwähnenswert, dass das Buch vor 9 Jahren geschrieben wurde.Vielleicht gab es damals nur ein verstecktes Feld. Jetzt scheint es zwei zu geben.) –
Es gibt auch einen Synchronisationsmonitor in D2009. Ich werde aktualisieren. –