32ビットプロセッサと64ビットプロセッサのオブジェクトサイズの違いを理解しようとしています。簡単なクラスがあるとしましょう
class MyClass
{
int x;
int y;
}
したがって、32ビットマシンでは、整数は4バイトです。Syncblockを追加すると(さらに4バイト)、オブジェクトサイズは12バイトになります。なぜ16バイトを表示しているのですか?
0:000>!do 0x029d8b98
名前:ConsoleApplication1.Program + MyClass
MethodTable:000e33b0
EEClass:000e149c
サイズ:16(0x10)バイト
(C:\ MyTemp \ ConsoleApplication1 \ ConsoleApplication1 \ bin \ x86 \ Debug \ ConsoleApplication1.exe)
田畑:
MTフィールドオフセットタイプVT属性値名
71972d70 4000003 4System.Int321インスタンス0x
71972d70 4000004 8System.Int321インスタンス0y
64ビットマシンでは、整数は4バイトのままですが、変更されるのはSyncblockが8バイトになることだけです(64ビットマシンではポインターが8バイトであるため)。つまり、オブジェクトサイズは16バイトになります。なぜ24バイトを表示しているのですか?
0:000>!do 0x00000000028f3c90
名前:ConsoleApplication1.Program + MyClass
メソッドテーブル:000007ff00043af8
EEClass:000007ff00182408
サイズ:24(0x18)バイト
(C:\ MyTemp \ ConsoleApplication1 \ ConsoleApplication1 \ bin \ Debug \ ConsoleApplication1.exe)
田畑:
MTフィールドオフセットタイプVT属性値名
000007fef4edd998 4000003 8System.Int321インスタンス0x
000007fef4edd998 4000004 cSystem.Int321インスタンス0y