Próbuję zrozumieć różnicę wielkości obiektu między procesorami 32- i 64-bitowymi. Powiedzmy, że mam prostą klasęOpis rozmiaru obiektu CLR między 32-bitowym a 64-bitowym
Tak więc na komputerze 32-bitowym liczba całkowita wynosi 4 bajty. Jeśli dodaję do niego blok synchroniczny (kolejne 4 bajty), rozmiar obiektu wyniesie 12 bajtów. Dlaczego pokazuje 16 bajtów?
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
Na komputerze 64 bitowym liczbą całkowitą jest jeszcze 4 bajty jedyną rzeczą jest to, że zmieniły Syncblock będzie 8 bajtów (jako wskaźniki są 8 bajtów na 64 maszynach bit). oznacza to, że rozmiar obiektu wynosi 16 bajtów. Dlaczego pokazuje 24 bajty?
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
Wyrównany lub nie, rozmiar powinien nadal odzwierciedlać rzeczywisty rozmiar obiektu. Wypełnienie będzie liczone tylko do rozmiaru, jeśli jest pomiędzy członkami, co nie ma miejsca w tym przypadku. – cHao
Szczegóły dotyczące jakiegokolwiek narzutu na zewnątrz obiektu nie są w tym przypadku istotne. Większość tego obciążenia znajduje się w tabelach obiektów w środowisku wykonawczym, a nie w obiekcie. – cHao