2009-10-27 12 views
11

Ogniqualvolta viene creato un nuovo oggetto, l'oggetto viene creato nell'heap. La memoria allocata per ogni oggetto ha due campi aggiuntivi 1) Il puntatore dell'oggetto tipo 2) indice del blocco di sincronizzazione.Oggetti allocati nell'heap

Che cosa è esattamente l'utilizzo di questi due campi. Qualcuno può far luce su questo?

+0

Dato che tutti gli oggetti sono di un tipo specifico, howelse è il runtime dovuto sapere a meno che non registri il tipo da qualche parte ...? Non preoccuparti di leggere quel tipo di cose, preoccupati del tuo codice. –

+0

@mP Esattamente - quindi perché non registra tali informazioni per i tipi di valore? Vale sempre la pena sapere come funzionano i tuoi strumenti. – TarkaDaal

risposta

17

Il puntatore dell'oggetto tipo viene utilizzato per rappresentare il tipo dell'oggetto. Questo è necessario per:

  • metodo di ricerca (vtable)
  • Controllo getta
  • Trovare l'oggetto Type se si chiama GetType.

Il campo syncblock viene utilizzato principalmente per il blocco. Viene compilato solo quando è necessario, e quando un blocco è sempre incontestato, il CLR agisce con un blocco "sottile" che non richiede dati esterni. Altrimenti, è una voce in una tabella a livello di processo - Non conosco i dettagli di ciò che è nella tabella, ma immagino che sia una lista di thread in attesa sul monitor dell'oggetto. Ovviamente il bit più importante di informazione è se il blocco è attualmente in attesa, da quale thread e quale è il suo conteggio (a causa della natura di rientro dei blocchi .NET).

Il syncblock viene compilato anche se si chiama GetHashCode() e non è sovrascritto, ma utilizza la tabella del processo per allocare un numero stabile, in pratica. (L'indirizzo dell'oggetto non è abbastanza buono in quanto può cambiare nel tempo.)

+0

Non sapevo che su GetHashCode e il syncblock ... hai più informazioni su di esso? Ho trovato questo http://blogs.msdn.com/brada/archive/2003/09/30/50396.aspx ma sembra essere .NET 1.0/1.1 solo ... – thecoop

+1

@thecoop: non ne ho altro riferimento alla mano, anche se mi aspetto che venga menzionato in CLR tramite C#. –

+0

Credo che il syncblock sia utilizzato anche per archiviare i metadati di interoperabilità COM e un AppDomainID (come ha detto @JonSkeet, è una voce in una tabella "_process-wide_".) – Sindhudweep

2

L'indice del blocco di sincronizzazione viene utilizzato sotto la cappa dalla classe Monitor e quindi anche l'istruzione lock.

1

Alcuni bit dell'indice di blocco di sincronizzazione vengono anche utilizzati da GC per contrassegnare un oggetto come garbage nel caso in cui non sia più referenziato.

Problemi correlati