うにてぃブログ

主にUnityとC#に関する記事を書いていきます

【C#】ToArray の GC を見る

Primitive型

int 型のからリストを ToArray してみてGCを見てみる

var list = new List<int>();
// 32B
list.ToArray();

次に 1要素だけ入れて見てみる

var list = new List<int>(){0};
// 36B
list.ToArray();

36B になった int 型が 4B なのでおそらく要素分だけゴミが出てるのだと思われる

なので 100個要素を入れて確認してみる

var list = new List<int>();
for (int i = 0; i < 100; i++)
    list.Add(i);
// 432B
list.ToArray();

結果は 423B で予想通り要素の分だけゴミが出た

一応 short でも確認してみる

var list = new List<short>();
for (short i = 0; i < 100; i++)
    list.Add(i);
// 232 B
list.ToArray();

short は 2B なので 232B で合ってる

クラス

空のクラスで検証してみる

private class Test1{}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 40B
list.ToArray();

8B 増えた

次に クラスに変数を足してみる

private class Test1
{
    public int IntValue1;
}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 40B
list.ToArray();

更に足してみる

private class Test1
{
    public int IntValue1;
    public int IntValue2;
}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 40B
list.ToArray();

クラスの場合はクラスのサイズに関わらず、8B ずつ増えていく模様

Struct

空の Struct で検証

private struct Test1{}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 33B
list.ToArray();

変数を追加

private struct Test1
{
    public int IntValue1;
}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 36B
list.ToArray();

更に変数を追加

private struct Test1
{
    public int IntValue1;
    public int IntValue2;
}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 40B
list.ToArray();

片方の型を変えてみる

private struct Test1
{
    public int IntValue1;
    public short IntValue2;
}

var list = new List<Test1>();
for (int i = 0; i < 1; i++)
    list.Add(new Test1());

// 40B
list.ToArray();

Structでは空の場合 1B
空じゃない場合は、変数1つにつき4B 増える

まとめ

Primitive

型サイズ * List.Count

Class

List.Count * 8B

Struct

変数の数 * 4B * List.Count