質問: [] for _ in 1...max { a += [T()] } } } } // 追加 class T {} ```
回答: > > ですが実際は、追加構文あり: 9MB, なし: 27.3MB と変化しました。 > > > 追加構文ありの方が **小さく** 書かれていますが、これは書き間違いでしょうか? 追加構文ありの方が **大きい** という前提で、質問の内容は、大量のインスタンスの生成でメモリの使用量が増え、それらのインスタンスを削除した後も元に戻らないのがなぜですか? ということだと理解しました。 これは正常な動作です。Swift を含め、ほとんどの言語の実行環境は、オブジェクトを格納するためにヒープ領域という、ある程度まとまった大きさのメモリ領域を確保します。ヒープ領域の初期サイズはあまり大きくありませんが、オブジェクトを格納しきれなくなりそうになると、そのサイズが拡張されます。 いったん拡張したヒープは、オブジェクトを解放して空きができた後も、簡単には元のサイズに縮小されません。これは、以下のような理由によるものです。 1. ヒープ領域に、まだ生きているオブジェクトがまばらに残っており、まとまった領域を解放することができない。オブジェクトを移動して、ヒープ領域の一箇所にまとめる方法もあるが、これには実行コストがかかる。また、Swift がこのような方法を採用しているかは不明。(ガベージコレクションを採用している言語では、オブジェクトの移動をすることが多いが、Swift はリファレンスカウントという、別の方法を採用している) 2. ヒープ領域の確保には、OSカーネルとのやりとりが発生するため、ある程度の実行コストがかかる。ヒープ領域をすぐに解放しないで、この後、生成されるオブジェクトのために再利用した方が、実行速度の面で有利。