2011-07-24 24 views
2


オブジェクトがメモリにどのように格納されているのでしょうか?
私はすでに、オブジェクトに格納されているメモリ内の場所を含むint値である参照(ポインタのような)があることを知っていますが、それはどのように格納されていますか?
short eを持つClassCがあると言います - それぞれのビットがそれぞれ異なるビット数であるが、それぞれのビット数がどのように記憶されているか知っています - 書き込むときにどのビットにアクセスすればよいかは正確に分かりますOBJ.cまたはOBJ.b
全体(非静的)オブジェクトをバイトの配列\ビットに変換して戻すことは幾分可能ですか?
明らかに、ClassC.TcpListener tcpのようなものがある場合、それは参照番号で、intとして保存されています(バイトは同じです)。しかし、それでもintとポインタはどのように異なっていますか?
オブジェクトはどのようにC#のメモリに格納されますか?

+1

「どのように正確に格納されますか?」 - ここであなたが探しているものを正確に明らかにすることはできますか?ヒープ対スタック?永遠?他に何か? – Oded

+1

ここでのほとんどの回答は実装の詳細です。参照は主に不透明であることを意図しています。たとえそれがほとんどの場合ポインタになっても、*必須*ではありません。また、 64ビットのリファレンスは32ビットではなく32ビット(int) –

+1

また、ECMA-335はこれに完全な答えを与えます。もちろん、ちょっと乾燥しています。 –

答えて

1

通常、CライブラリをP/Invokingしていない限り、気にする必要はありません。

OBJ.cまたはOBJ.bを書き込むときに、どのビットをアクセスする必要があるかをC#がどのくらい知っていますか?

オブジェクトのStructLayoutによって異なります。 2つの可能なLayoutKindがあります。

デフォルトはシーケンシャルで、フィールドは宣言された順序と同じ順序で格納されます。alignedが適切です。

  • は0-3オフセット:デフォルトでは、5つのフィールドを含むstructとして記憶されるだろうint a
  • は4-5オフセット:
  • は8オフセットパディング:char b
  • は6-7オフセット15:long c
  • は16-19オフセット:float d
  • は20-21オフセット:short e

classは、vtableポインタ、ガベージコレクタメタデータなどのためにレイアウトが多少異なる場合があります。どういう仕組みかは分かりません。

他のLayoutKindはExplicitで、フィールドオフセットを明示的に指定します。

全体(非静的)オブジェクトをバイトの配列\ビットに変換して戻すことは幾分可能ですか?

はい、Marshalクラスでこれを行えます。 StructureToPtrおよびPtrToStructureを参照してください。

それは参照だとint

として格納ポインタがint Sとして格納されていません。 64ビットシステムでは動作しません。代わりにIntPtrが使用されます。

でも、intとポインタの違いは何ですか?

どのレベルですか? C#? CIL?機械語?

+0

"オブジェクトのStructLayout"は幾分矛盾しているようです... –

+0

私はそれをチェックします。ありがとう! –

+0

'Marshal'クラスは、少なくとも必ずしもそうではなく、それらがメモリ内のバイトを見ることを許しません。それは、アンマネージコードに適した形式に変換することです。しばしば、その翻訳は何もしませんが、必ずしもそうではありません。 – svick

2

実際には、オブジェクト内のメンバーにアクセスする場所がわかりません。オブジェクトのレイアウトを決めるのはJITコンパイラです。

JITコンパイラがメンバーを特定の方法で配置するようにメンバーの属性を追加することができます。これにより、すべてのメンバーにメモリブロックとしてアクセスできるようになりますが、それほど努力する価値はありません。

注:ポインタは、32ビットシステムでは32ビット(int)、64ビットシステムでは64ビット(long)です。

+0

だから、64ビットシステムではメモリ>が一杯になるのです。< –

関連する問題