C# と C++ : Memory Allocation (1)

楽観的にコーディングを行うならば,C#C++ のメモリ資源に対するコーディングスタイルは以下のように明確な違いが現れます.

  1. C# では,ある程度まとまった段階で自動的にオンデマンドにメモリが解放される.確定的なメモリ解放を意図したコーディングは行わない.メモリ解放コストはまとめ払いされる.
  2. C++ では,オブジェクトが不要になった段階でメモリをすみやかに解放するようにコーディングする.これは結果的にメモリ解放のコストをあちらこちらで分割払いを行うという形になりやすい.

もちろん,どちらが優れているかはケースバイケースです.直感的には後者の「コスト分割払い方式」は,ワーキングセットの最大値が少なくてすむことや応答時間にむらが出来にくいことといったメリットが挙げられます.前者の「解放コストまとめ払い方式」は処理がある程度まとまった段階で処理を行うため,大域的な最適化では有利と考えられます.従って「解放コストまとめ払い方式」の方がスループット (一定時間内に処理できる仕事量) では「コスト分割払い方式」を上回る可能性もあります.
もちろん実装自由度の大きな C++ では常に上に挙げたスタイルを採る必要はありません.実際タイトなチューニングを要請されるゲームプログラミングでは,メモリアロケーションに関する最適化は重要な項目の 1 つです*1.これはメモリ確保・解放処理のほとんど全てを CLR に処理を丸投げしている C# とは対照的と言えるかもしれません.