Domanda

Ogni volta che viene creato un nuovo oggetto, l'oggetto viene creato sull'heap. La memoria allocata per ogni oggetto ha due campi aggiuntivi 1) Il tipo puntatore oggetto 2) sincronizza l'indice di blocco.

Qual è esattamente l'uso di questi due campi. Qualcuno può far luce su questo?

È stato utile?

Soluzione

Il puntatore oggetto tipo viene usato per rappresentare il tipo di oggetto. Questo è necessario per:

  • Ricerca del metodo (la vtable)
  • Verifica dei cast
  • Trovare l'oggetto Type se si chiama GetType .

Il campo syncblock viene utilizzato principalmente per il blocco. Viene compilato solo quando deve essere, e quando un blocco è sempre incontestato, il CLR accontenta un "sottile" blocco che non richiede alcun dato esterno. Altrimenti, è una voce in una tabella a livello di processo - non conosco i dettagli di ciò che è nella tabella, ma immagino che sia qualcosa come un elenco di thread in attesa sul monitor dell'oggetto. Naturalmente il bit più importante di informazioni è se il blocco è attualmente detenuto, da quale thread e quale sia il suo conteggio (a causa della natura rientrante dei blocchi .NET).

Il syncblock viene inoltre compilato se si chiama GetHashCode () e non viene ignorato: in pratica utilizza la tabella a livello di processo per allocare un numero stabile. (L'indirizzo dell'oggetto non è abbastanza buono in quanto può cambiare nel tempo.)

Altri suggerimenti

L'oggetto tipo è ciò che viene restituito dalla chiamata obj.GetType

blocco di sincronizzazione utilizzato per la sincronizzazione

See:

L'indice del blocco di sincronizzazione viene utilizzato sotto il cofano della classe Monitor e quindi anche l'istruzione lock.

Alcuni bit dell'indice del blocco di sincronizzazione vengono utilizzati anche da GC per contrassegnare un oggetto come immondizia nel caso in cui non venga più indicato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top