3
class Book
{
    public int ISBN { get; set; }      
}

void Method() 
{
  Book book = new Book(); 
  // Break and verify in SoS Debugging.
}


   !dumpheap -type Book
   PDB symbol for clr.dll not loaded
   Address       MT     **Size**
   00c6b76c 009b7f2c       **12**      
   total 0 objects
   Statistics:
   MT    Count    TotalSize Class Name
   009b7f2c        1           12 GCTest.Book
   Total 1 objects

ここでのオブジェクトのサイズはなんと12バイト。1 つの整数プロパティのみが含まれます。sizeof(int) = 4 バイト残り 8 バイト? (オブジェクトのインスタンス化)。誰でも光を当てることができますか?

4

2 に答える 2

4

すべての参照オブジェクトには、次の 2 つの追加フィールドが追加されています。

Object type ptr : 4 バイト (オブジェクトがインスタンス化されるか、参照型のメソッド テーブルを保持する構造を含むメモリ (AppDomain 固有) のアドレス)

Sync block adress: 4 バイト (ブロックアドレスを同期し、参照型のインスタンスへのアクセスを同期するために使用される構造を含むプロセス全体のテーブル内の場所を指します)

詳細情報 この記事でメモリ レイアウトを確認してください

于 2012-07-16T12:32:27.823 に答える
1

オブジェクト構造の上に 8 バイトの情報があります。

オブジェクト参照用に 4 バイト

syncblk用の 4 バイト: 同期化に使用される特別なメモリ ブロック。特定のケースではオブジェクトは同期操作に参加しないため、0 に設定されます。

言い換えると:

<--SyncBlock(4bytes)--> <--ObjectReferece(4bytes)--> <--オブジェクトデータ-->

詳細については、以下をご覧ください。

.NET Framework の内部にドリルダウンして、CLR がランタイム オブジェクトを作成する方法を確認する

于 2012-07-16T12:37:44.570 に答える