2009-03-24 4 views
7

TObject.InstanceSize gibt 8 zurück, und TObject deklariert keine Datenelemente. Entsprechend der Implementierung von TObject.ClassType können die ersten 4 Bytes als Zeiger auf die TClass-Metadaten des Objekts erklärt werden. Wer weiß, wofür die anderen 4 Bytes Overhead da sind?Welche Daten enthält ein TObject?

EDIT: Anscheinend ist dies spezifisch für D2009. In älteren Versionen sind es nur 4 Bytes.

Antwort

11

In Delphi 2009 gibt es the ability to have a reference to a synchronization monitor. Siehe:

class function TMonitor.GetFieldAddress(AObject: TObject): PPMonitor; 
class function TMonitor.GetMonitor(AObject: TObject): PMonitor; 

... in System.pas

Auch gibt noch ein Zeiger auf die VMT ist. (Virtual Methode Tabelle.) From Delphi in a Nutshell:

Die TObject Klasse deklariert mehrere Methoden und ein spezielles, verstecktes Feld einen Verweis zu speichern, um das Klasse des Objekts. Dieses ausgeblendete Feld verweist auf die virtuelle Methodentabelle (VMT) der Klasse . Jede Klasse hat eine eindeutige VMT und alle Objekte dieser Klasse teilen sich die VMT der Klasse .

+0

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? –

+0

(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.) –

+0

Es gibt auch einen Synchronisationsmonitor in D2009. Ich werde aktualisieren. –

3

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.

+0

Nein. GetInterfaceTable ist eine Klassenfunktion, die auf einem Offset vom VMT-Standort basiert. Sehen Sie sich die Implementierung von TMonitor.GetFieldAddress an. Offenbar ist es abhängig vom Laufzeittyp, genau wie du es beschrieben hast. –

+0

GetInterfaceTable holt etwas anderes, getrennt von der Schnittstellenreferenz. Die Schnittstellentabelle wird von allen Instanzen einer Klasse wie die VMT gemeinsam genutzt. Die Schnittstellenreferenz wird nicht von anderen Instanzen verwendet. Lesen Sie meinen Artikel, um mehr über das Layout von Interfaceklassen zu erfahren. –

+0

Ich kann die Quelle für TMonitor.GetFieldAddress nicht überprüfen; Ich habe Delphi 2009 nicht. –

Verwandte Themen