ヘッダーのサイズは2ワードだと思います。1つは型参照用で、もう1つは同期ブロックとその他のフラグ用です。パディングは(私が思うに)合計サイズを整数の単語に切り上げるのにちょうど十分です。
たとえば、ここに示すように、「int」のみを含む参照型は、x86で12バイトを使用します。
using System;
public class Foo
{
int x;
public Foo(int x)
{
this.x = x;
}
}
public class Test
{
static void Main(string[] args)
{
int length = int.Parse(args[0]);
Foo x = new Foo(0);
Foo[] array = new Foo[length];
// Make sure that JITting the string constructor doesn't
// change things
long start = GC.GetTotalMemory(true);
for (int i=0; i < length; i++)
{
array[i] = new Foo(i);
}
long end = GC.GetTotalMemory(true);
GC.KeepAlive(array);
GC.KeepAlive(x);
decimal totalDecimal = end-start;
Console.WriteLine(totalDecimal / length);
}
}
興味深い点の1つ-何らかの理由で、System.Objectのインスタンスは、他の方法で予測した8バイトではなく12バイト(x86上)を使用します。最小サイズが12バイトであるかのようですが、実際のデータの最初の4バイトは解放されます:)
報告されたサイズが正確に整数ではない理由はわかりませんが、マネージドヒープのページごとに必要な少しの余分なメモリなどと関係があるのではないかと思います。結果が12を少し超える場合もあれば、12を少し下回る場合もあります。これは、指定された長さに依存しているようです。(この回答の以前のバージョンには、最初のコマンドライン引数を解析するが無視するというバグがありました。これを修正しました。)とにかく、このわずかな不正確さはサイズとは関係がないと思います。メモリ内の個々のオブジェクトの。