2004-04-12 [長年日記]
メモリ動的確保
「Cの動的メモリ確保が遅いのかも」ということなので、ちょっと調べてみました。
まず、malloc/freeがどのように実装されているかというと、詳細は説明するのが面倒なので「プログラミング言語C第二版」の記憶割り当てあたりを参照してもらうとして、簡単に言うと二つの機能により実現されています。
- OSからの動的メモリ確保
- リンクによる空きリストの管理
同一の関数の中で可変長配列とallocaの両方を使うと、 可変長配列の領域が解放されるときに、 その可変長配列が割り当てられたあとにallocaによって割り当てられた領域も すべて解放されることになります
[C言語ファミリに対する拡張機能より引用]
というところからの推測です。そして、allocaの実装がどうなっているかというと、多くの場合スタック上にメモリを確保していると思われます。
こうすることにより、関数を抜けたときに領域が開放されるという仕様がより自然に実現できます。
そして、スタックポインタの操作だけですむgccの可変長配列の方がmallocによるメモリの動的確保より速いのは自明でしょう。