Un oggetto contiene voci per tutti i suoi campi, oltre a uno spazio aggiuntivo per contenere un puntatore alla tabella del metodo virtuale. Il VMT contiene più di semplici puntatori del metodo virtuale. Spiego more about the VMT sul mio sito Web, incluso un diagramma.
Apparentemente, Delphi 2009 introduce un altro campo nascosto oltre al puntatore VMT per contenere il monitor di sincronizzazione. È possibile determinare se si è aggiunto all'inizio o alla fine della classe con un codice semplice:
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.
Se si stampa il valore 4, il campo monitor deve essere alla fine l'oggetto a causa 4 conta solo per la dimensione del puntatore VMT. Se stampa il valore 8, il campo del monitor deve essere all'inizio, adiacente al puntatore del VMT.
Mi aspetto che troverai il monitor all'inizio. Altrimenti, significa che il layout dell'oggetto discendente non è semplicemente il layout dell'oggetto base con tutti i nuovi campi aggiunti. Significa che l'offset del campo del monitor dipende dal tipo di runtime dell'oggetto e ciò rende l'implementazione più complicata.
Quando una classe implementa un'interfaccia, il layout dell'oggetto include più campi nascosti. I campi contengono puntatori al valore di riferimento dell'interfaccia dell'oggetto. Quando si dispone di un riferimento IUnknown
a un oggetto, il puntatore che contiene non è lo stesso del puntatore al campo VMT dell'oggetto, che è ciò che si ha con un riferimento di oggetto ordinario. Il valore del puntatore IUnknown
sarà l'indirizzo del campo nascosto. Ho scritto more about the layout of classes that implement interfaces.
fonte
2009-03-24 21:00:30
Questa è la stessa cosa, in realtà. Il riferimento TClass di una classe punta al suo VMT. Quindi sono gli stessi 4 byte. Quali sono gli altri 4? –
(Vale la pena notare che quel libro è stato scritto 9 anni fa.Forse all'epoca esisteva solo un campo nascosto. Ora sembra che ce ne siano due.) –
C'è anche un monitor di sincronizzazione in D2009. Aggiornerò –