CLR オブジェクトヘッダーの構造

前の投稿Andrew Hunter 氏の “Object Overhead: The Hidden .NET Memory Allocation Cost” を和訳した。その時、オブジェクトヘッダーという単語が出てきたのだが、何なのかよくわからなかったので調べてみた。

本棚を漁ったところ、Essential .NET に載っていた。実行時のメモリ内はこういう構造になっているとのこと (ただし、x86 の CLR 1.0 の動作を観察して得た結論らしい)。

clrobjectheader

オブジェクトヘッダーには同期ブロックのインデックスと型のハンドルの2つのフィールドがあって、多分インデックスが int、型ハンドルがポインタなので、オブジェクトヘッダーのサイズは 4 バイト + 4 バイト = 8 バイトなんでしょう。

ちなみに、同期ブロックのインデックスというのは

ロックや COM オブジェクトなどの追加リソースをこのオブジェクトと関連付けるために利用

するものなんだそうです。

型のハンドルというのは、図で示されている通り、オブジェクトの実際の型を現す型構造体へのポインタです。

Comments

Popular posts from this blog

TFS: 別PCでのチェックアウトを取り消す

WPF の RichTextBox に文字列を設定する&取り出す

WPFアプリにアニメーションGIFを表示させる