2012-01-21 16 views
11

¿Cuál es el diseño de memoria de una clase CLR?Disposición de memoria de clase CLR

Viniendo de un fondo C++, el diseño de memoria de una clase C++ con funciones virtuales comienza con un puntero v-table, y luego los miembros de datos de la clase siguen en la memoria.

¿Las clases CLR con funciones virtuales tienen un puntero v-table? ¿Este puntero es el primer campo en el diseño de la memoria de la clase? ¿Hay campos adicionales en un diseño de memoria de clase CLR además de los miembros de datos definidos por los programadores? ¿Y qué representan estos campos adicionales?

+0

el diseño de la memoria de las clases C# suele estar determinado por el JITTER y, por lo tanto, solo se manifiesta en el tiempo de ejecución (aunque hay algunas excepciones). – Yahia

+3

C# no tiene nada que decir sobre el diseño de la memoria. Esto es sobre clases CLR. –

+0

Si desea ver la VTable de una manera más práctica, puede seguir mensajes como este para ejecutar el comando '! DumpMT -MD address' en WinDbg, https://blogs.msdn.microsoft.com/kristoffer/2007/ 01/02/setting-a-breakpoint-in-managed-code-using-windbg/ –

Respuesta

9

Es específico de la implementación, pero this article ofrece una descripción de lo que estaba presente en la implementación de Microsoft .NET, para CLR v2. I sospechoso es lo mismo para CLR v4, pero no podría garantizarlo. Busque una sección llamada "ObjectInstance" para los detalles, pero puede encontrar todo el artículo interesante.

Según el artículo, hay básicamente dos bits de cabecera: el bloque sincronización que se utiliza para el bloqueo, y la referencia tipo que es básicamente un puntero a información de tipo (incluyendo el vtable).

+0

¡Gracias! El artículo que me señalas parece ser lo que estaba buscando. –

+0

Este enlace está roto. :( –

+0

@MrAnderson: Ratas: no estoy seguro de cómo encontrar eso, lamentablemente ... –

1

El artículo original "Jit and Run" es still around, as a chm file. Sólo tienes que seguir el MSDN instructions a ser capaz de leer:

En la mayoría de las versiones de Windows primero debe guardar estos archivos a su máquina local, y luego desbloquear el archivo con el fin de leerlo. Para desbloquear un archivo, hacer clic derecho sobre él y seleccionar propiedades, y luego seleccionar el botón 'desbloquear'. El contenido estará entonces disponible para leer

Sin embargo, el venerable Jon Skeet supuso mal - y el diseño de memoria objeto ha cambiado de hecho. Sasha Goldstein brinda una encuesta actualizada del diseño (CLR v4), here.