読者です 読者をやめる 読者になる 読者になる

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

.NET

かつて fj.comp.lang.c で free-on-exit という大論争が実に数年にも渡って繰り広げられました.この長き論争は,C 言語において malloc によって確保したヒープメモリのうちプロセス終了直前に未解放な領域については,free を呼ばずそのまま終了してしまうことが余分な処理の回避につながる,という主張に端を発します.この主張の是非はとにかく,変数スコープとデストラクタによって宣言的に解放処理を織り込むことが多い C++ では実際プロセス終了直前に多くのメモリ解放処理が発生することがあるのは確かです.メモリ解放時に検査処理が追加されることで特に負荷の大きなデバッグビルドでの実行時に,要素数の非常に多い std::map の解放処理がプロセス終了を秒単位で遅らせるという経験をされた方もおられるかもしれません.
一方 C# では,単なるメモリ解放処理だけを行うオブジェクトの後始末関数はその存在も呼び出しも不要なものになります.プロセス終了直前に GC.Collect を呼び出すのは,ファイナライザの確実な呼び出しに特別な関心がある場合を除いて,多くの場合は無駄となるでしょう.