1

一言で言えばC#5.0から: 22ページの決定的なリファレンス。

参照型では、参照とオブジェクトに別々のメモリを割り当てる必要があります。オブジェクトは、そのフィールドと同じバイト数を消費し、追加の管理オーバーヘッドを加えます。正確なオーバーヘッドは本質的に .NET ランタイムの実装に限定されますが、少なくともオーバーヘッドは 8 バイトであり、オブジェクトの型のキーと、マルチスレッドのロック状態やフラグなどの一時的な情報を格納するために使用されます。ガベージ コレクタによる移動から修正されたかどうかを示します。オブジェクトへの各参照には、.NET ランタイムが 32 ビットまたは 64 ビットのどちらのプラットフォームで実行されているかに応じて、追加の 4 または 8 バイトが必要です。

この大胆な部分を完全に理解しているかどうかはよくわかりません。32 ビット プラットフォームでは参照に 4 バイトが必要であり、64 ビット プラットフォームでは 8 バイトが必要です。

だから、私たちが持っているとしましょう

string s = "Soner";

sこの参照に必要なバイト数を確認するにはどうすればよいですか?

4

3 に答える 3

6

使用できますEnvironment.Is64BitProcess。そうである場合、すべての参照は 8 バイトになります。そうでない場合、すべての参照は 4 バイトになります。参照のタイプ、およびそれが参照するオブジェクトの内容は関係ありません。

編集:削除された回答に記載されているように、IntPtr.Sizeさらに簡単です。

編集:コメントに記載されているように、現在CLR のすべての参照は同じサイズですが、ある時点で、多くの場合「圧縮 oops」を使用して参照を 32 として格納する Hotspot への同様のパスをたどる可能性があります。 -64 ビット プロセスでもビット値を使用できます (使用可能なメモリを制限することはありません)。

于 2013-07-04T19:59:52.053 に答える