Tôi đang cố gắng hiểu sự khác biệt về kích thước đối tượng giữa bộ xử lý 32 bit và 64 bit. Giả sử tôi có một lớp đơn giảnTìm hiểu kích thước đối tượng CLR giữa 32 bit so với 64 bit
class MyClass
{
int x;
int y;
}
Vì vậy, trên máy 32 bit, số nguyên là 4 byte. Nếu tôi thêm Syncblock vào nó (4 byte khác), kích thước đối tượng sẽ là 12 byte. Tại sao nó hiển thị 16 byte?
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
Trên máy 64 bit, một số nguyên vẫn là 4 byte, điều duy nhất được thay đổi là Syncblock sẽ là 8 byte (như con trỏ là 8 byte trên máy 64 bit). điều đó có nghĩa là kích thước đối tượng sẽ là 16 byte. Tại sao nó hiển thị 24 byte?
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
Đã được căn chỉnh hay không, kích thước vẫn phải phản ánh kích thước thực của đối tượng. Phần đệm sẽ chỉ được tính vào kích thước nếu nó nằm giữa các thành viên, mà dường như không phải là trường hợp ở đây. – cHao
Các chi tiết về bất kỳ chi phí nào bên ngoài đối tượng không thực sự có liên quan trong trường hợp này. Hầu hết các chi phí trên là trong các bảng đối tượng trong thời gian chạy, không phải trên đối tượng. – cHao