Понимание размера объекта CLR между 32-битным и 64-битным

Я пытаюсь понять разницу в размере объекта между 32-битным и 64-битным процессорами. Допустим, у меня есть простой класс

class MyClass   
{  
    int x;  
    int y;  
}  

. Итак, на 32-битной машине целое число составляет 4 байта. Если я добавлю в него Syncblock (еще 4 байта), размер объекта будет 12 байтов. Почему показывает 16 байт?

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  

На 64-битной машине целое число по-прежнему составляет 4 байта, единственное, что изменилось, - это то, что Syncblock будет равен 8 байтам (поскольку указатели равны 8 байтам на 64-битных машинах). это означает, что размер объекта будет 16 байт. Почему показывает 24 байта?

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  
16
задан dtb 28 September 2010 в 17:04
поделиться