Pergunta
Sempre que qualquer novo objeto é criado, o objeto é criado no heap. A memória alocada para cada objecto tem dois campos adicionais 1) O ponteiro do tipo de objecto índice bloco 2) de sincronização.
O que é exatamente o uso desses dois campos. Alguém pode lançar luz sobre isso?
Solução
O ponteiro objeto tipo é usado para representar o tipo do objecto. Isso é necessário para:
- lookup Method (vtable)
- Verificar moldes
- Encontrar o objeto
Type
se você chamarGetType
.
O campo syncblock é utilizado principalmente para o bloqueio. É só preencher quando ele precisa ser, e quando um bloqueio é sempre contestado a CLR marcas fazer com um bloqueio "fina", que não requer qualquer de dados externa. Caso contrário, é uma entrada em uma tabela de todo o processo - Eu não sei os detalhes do que está em cima da mesa, mas eu imagino que é coisas como uma lista de segmentos de espera no monitor do objeto. Claro que o bit de informação mais importante é se ou não o bloqueio é actualmente detida pela qual segmento, e que sua contagem é (devido à natureza de reentrada de .NET fechaduras).
O syncblock também é preenchido se você chamar GetHashCode()
e não é substituído - ele usa a mesa de todo o processo para atribuir um número estável, basicamente. (O endereço do objeto não é bom o suficiente, pois ele pode mudar ao longo do tempo.)
Outras dicas
tipo de objeto é o retornado por obj.GetType chamada
bloco de sincronização usado para sincronização
Veja:
O índice de blocos de sincronização é usado sob o capô pela classe monitor e, portanto, a declaração de bloqueio também.
Alguns bits de índice de blocos de sincronização são também utilizados por GC para marcar um objecto como lixo no caso já não é referenciado.