2

整数プロパティを含むクラスが16バイトのスペースを必要とするというMarioHewardtのセッションをすでに見ました。単純な次のクラスのサイズが16になる可能性があることを知りたいですか?

[StructLayout(LayoutKind.Sequential)]
public class MyClass
{
    public int Age;
}

問題は、整数が4バイトのスペースを必要とすることです(右?)ので、他の12バイトはどこから来たのですか?また、Marshal.SizeOfを使用して、4になるクラスサイズを取得しました。

int n = Marshal.SizeOf(typeof(MyClass));
//n == 4

私はこれを読みましが、上記のクラスは8バイトの内部データ(とにかくこれらのデータは何ですか?)、int値用に4バイト、および4バイトの未使用スペースを保持しているようです。では、16バイトかかる場合、Marshal.SizeOfが4を返すのはなぜですか?そしてそれが4をとるなら、それらの8バイトはどこでなくなったのでしょうか?私は本当に混乱しています。

4

2 に答える 2

2

Marshal.SizeOf(Type)は、同等のアンマネージ型のサイズを返します。つまり、同等のアンマネージ型(C ++クラスなど)が同じフィールドレイアウトとパッキングを使用した場合に必要なバイト数を返します。この関数は、LayoutKindがまたはのいずれかである[StructLayout]属性を持つクラスでのみ機能するように設計されていることに注意しください。ExplicitSequential

CLRが管理対象ヒープにオブジェクトを割り当てるときに使用されるメモリは、問題のCLRの内部によって異なります。.NET Frameworkの内部にドリルインして、CLRがランタイムオブジェクトを作成する方法を確認するは、オブジェクト割り当てのCLRv2実装に関する記事です。基本的に、すべてのオブジェクトには、同期ブロックインデックスとタイプハンドルの2つの非表示フィールドがあります。同期ブロックは、オブジェクトがlock(obj) {}ステートメントで使用されるときに使用される内部構造です。タイプハンドルは、特定のインスタンスに関するランタイムタイプ情報を提供します。これには、オブジェクトのメソッドテーブルなどが含まれます。

于 2012-07-11T06:43:04.200 に答える
0

実際、C#のクラスは、idに含まれるフィールドだけではありません。仮想キーワードとオーバーライドキーワードを使用できるように、仮想関数テーブルが必要です。また、メタデータ型へのポインタなど、他にもいくつかあります...

実際、気にする必要はありません...重要なのは「インスタンスを再構築できるようにするために何バイト必要ですか?」です。答えは、Marshal.SizeOfがあなたに与えるものです:4。

整数の4バイトのみをマーシャリングし(そうです、4バイトです)、MyClassを逆シリアル化することを知っていれば、それを実行するのに十分な情報があります。

于 2012-07-11T06:11:24.443 に答える