我正在尝试理解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个字节(因为在64位机器上指针是8个字节)。这意味着对象大小将为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