2012-01-21 9 views
11

CLRクラスのメモリレイアウトとは何ですか?CLRクラスのメモリレイアウト

仮想関数を持つC++クラスのメモリレイアウトは、vテーブルポインタで始まり、そのクラスのデータメンバーがメモリに追随します。

仮想関数を持つCLRクラスにはvテーブルポインタがありますか?このポインタはクラスメモリレイアウトの最初のフィールドですか?プログラマ定義のデータメンバーに加えて、CLRクラスのメモリレイアウトに余分なフィールドがありますか?これらの余分なフィールドは何を表していますか?

+0

C#クラスのメモリレイアウトは通常JITTERによって決定されるため、実行時にのみマニフェストされます(いくつかの例外があります)。 – Yahia

+3

C#はメモリレイアウトについて何の言い方もしていません。これはCLRクラスに関するものです。 –

+0

もっと実用的な方法でVTableを見たい場合は、次のようなポストをたどってWinDbgで '!DumpMT -MD address'コマンドを実行してください。https://blogs.msdn.microsoft.com/kristoffer/2007/ 01/02/set-a-breakpoint-in-managed-code-using-windbg/ –

答えて

9

実装に固有ですが、this articleは、Microsoft .NET実装の内容をCLR v2用に説明しています。 I 容疑者 CLR v4でも同じですが、保証できませんでした。詳細については、「ObjectInstance」というセクションを探してください。しかし、記事全体が面白いかもしれません。ロックするために使用されるシンクブロック、基本的に(仮想テーブルを含む)情報を入力するポインタである型参照

記事によれば、ヘッダの2ビットは、基本的には存在します。

+0

ありがとう!あなたが私に指摘した記事は、私が探していたもののようです。 –

+0

このリンクは壊れています。 : –

+0

@MrAnderson:Rats - それを見つける方法がわからない、残念ながら... –

1

オリジナルの「Jit and Run」記事はstill around, as a chm fileです。ただ、MSDN instructionsが読むことができるように、次のとおりです。

窓のほとんどのバージョンでは、あなたが最初にあなたの ローカルマシンにこれらのファイルを保存し、それを読むためには、ファイルのブロックを解除しなければなりません。 ファイルのブロックを解除するには、ファイルを右クリックして[プロパティ]を選択し、次に の[ブロック解除]ボタンを選択します。コンテンツはその後 に利用できるようになりますしかし

を読んで、由緒あるジョンスキートは間違って推測 - とオブジェクトのメモリレイアウトは、実際に変更されました。 Sasha Goldsteinは、レイアウトの最新の調査(CLR v4)をhereに提供しています。

関連する問題