Unity の foreach におけるメモリについて

カテゴリ:unity

うにばな メモリ使用量の最適化・ヒープメモリ ほか では『foreach は enumerator オブジェクトを生成する』とあるが,これは List<> のような Generics を使った場合の話である. 単純な配列の列挙ならば foreach はヒープにメモリを確保しない. これは foreach を含むコードをコンパイルして,プロジェクトフォルダ/Library/ScriptAssemblies/Assembly-CSharp.dll を IL DASM で見てみればわかる.

プロファイラでチェックしてもメモリは確保されていない. Unity のプロファイラでメモリ確保量を調べるには,対象のコード領域を Profile.BeginSample/EndSample で囲む. 詳しくは 【Unity】CPUプロファイラでパフォーマンスを改善する 前編 を参照.

以下のコードをプロファイラにかけると次のような結果になった.

result
結果

List<> のような Generics ではヒープに余計なメモリが確保されるので, そこは注意する必要がある.