Я пытаюсь понять разницу в размере объекта между 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