「The Truth About .NET Objects And Sharing They Between AppDomains」というタイトルの記事がオンラインにあり、いくつかのローター ソース コードと、オブジェクトを実験し、プレーン ポインターを介してアプリ ドメイン間でそれらを共有した結果が示されています。
http://geekswithblogs.net/akraus1/archive/2012/07/25/150301.aspx
- CLR のすべての 32 ビット バージョンで 12 バイト
- CLR のすべての 64 ビット バージョンで 24 バイト
何百万ものオブジェクト (N) を配列に追加することで、これを非常に簡単にテストできます。ポインターのサイズはわかっているため、値を N で割ることでオブジェクトのサイズを計算できます。
var initial = GC.GetTotalMemory(true);
const int N = 10 * 1000 * 1000;
var arr = new object[N];
for (int i = 0; i < N; i++)
{
arr[i] = new object();
}
var ObjSize = (initial - GC.GetTotalMemory(false) - N * IntPtr.Size) / N;
.NET プラットフォームでのおおよその値を取得します。
オブジェクト サイズは実際には、GC が最小オブジェクト サイズについて推測できるように定義されています。
\sscli20\clr\src\vm\object.h
//
// The generational GC requires that every object be at least 12 bytes
// in size.
#define MIN_OBJECT_SIZE (2*sizeof(BYTE*) + sizeof(ObjHeader))
たとえば 32 ビットの場合、これはオブジェクトの最小サイズが 12 バイトであることを意味し、4 バイトの穴が残ります。空のオブジェクトの場合、この穴は空ですが、たとえば int を空のクラスに追加すると、穴が埋められ、オブジェクトのサイズは 12 バイトのままになります。