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