C# オブジェクトのメモリ フットプリントの測定
C# オブジェクト インスタンスのメモリ使用量を正確に判断することは、パフォーマンスのチューニングと効果的なメモリ管理にとって非常に重要です。 C# にはこのための直接の組み込み関数がありませんが、文書化されていない内部メカニズムを活用できます。
CLR 内部データの利用
MSDN マガジンによる CLR 内部の調査により、TypeHandle
構造内の隠しフィールド「Basic Instance Size」が明らかになりました。このフィールドには、オブジェクトのインスタンス データ サイズが保存されます。
RuntimeTypeHandle
の採用と反省
リフレクションを使用してこのフィールドにアクセスし、オブジェクトの TypeHandle
を取得できます。 次のコードは、インスタンス サイズを取得する方法を示しています:
<code class="language-csharp">object obj = new List<int>(); RuntimeTypeHandle th = obj.GetType().TypeHandle; int size = *(*(int**)&th + 1); Console.WriteLine(size);</code>
重要な警告:
このメソッドは、内部 CLR 実装の詳細に依存します。 その信頼性は、すべてのシナリオまたは将来の .NET バージョンにわたって保証されるわけではありません。 さらに、フィールドのオフセットとデータ型はプラットフォームごとに異なる場合があります。
その他の注意点:
配列と文字列の場合、基本インスタンスのサイズは実際のデータへの参照のサイズのみを反映します。 合計メモリ使用量を計算するには、配列または文字列内の要素のサイズを追加する必要があります。
以上がC# オブジェクト インスタンスのサイズをバイト単位で確認するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。