Estoy tratando de comprender la diferencia de tamaño de objeto entre procesadores de 32 bits y 64 bits. Digamos que tengo una clase simpleComprensión del tamaño de objeto CLR entre 32 bit frente a 64 bit
class MyClass
{
int x;
int y;
}
Así que en una máquina de 32 bits, es un número entero de 4 bytes. Si agrego el Syncblock en él (otros 4 bytes), el tamaño del objeto será de 12 bytes. ¿Por qué muestra 16 bytes?
0:000> !do 0x029d8b98 Name: ConsoleApplication1.Program+MyClass MethodTable: 000e33b0 EEClass: 000e149c Size: 16(0x10) bytes (C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\x86\Debug\ConsoleApplication1.exe) Fields: MT Field Offset Type VT Attr Value Name 71972d70 4000003 4 System.Int32 1 instance 0 x 71972d70 4000004 8 System.Int32 1 instance 0 y
En una máquina de 64 bits, un número entero es todavía 4 bytes lo único cambiado es que Syncblock será de 8 bytes (como punteros son 8 bytes en equipos de 64 bits). eso significa que el tamaño del objeto será de 16 bytes. ¿Por qué muestra 24 bytes?
0:000> !do 0x00000000028f3c90 Name: ConsoleApplication1.Program+MyClass MethodTable: 000007ff00043af8 EEClass: 000007ff00182408 Size: 24(0x18) bytes (C:\MyTemp\ConsoleApplication1\ConsoleApplication1\bin\Debug\ConsoleApplication1.exe) Fields: MT Field Offset Type VT Attr Value Name 000007fef4edd998 4000003 8 System.Int32 1 instance 0 x 000007fef4edd998 4000004 c System.Int32 1 instance 0 y
Alineado o no, el tamaño aún debe reflejar el tamaño real del objeto. El relleno solo contaría para el tamaño si fuera entre miembros, lo que no parece ser el caso aquí. – cHao
Los detalles sobre cualquier sobrecarga fuera del objeto en sí no son realmente relevantes en este caso. La mayor parte de esa sobrecarga está en tablas de objetos en el tiempo de ejecución, no en el objeto. – cHao