2004-04-12 [長年日記]

メモリ動的確保

Cの動的メモリ確保が遅いのかも」ということなので、ちょっと調べてみました。

まず、malloc/freeがどのように実装されているかというと、詳細は説明するのが面倒なので「プログラミング言語C第二版」の記憶割り当てあたりを参照してもらうとして、簡単に言うと二つの機能により実現されています。

  • OSからの動的メモリ確保
  • リンクによる空きリストの管理

ようはそこそこ面倒なことをしているわけです。

次に、gccの可変長配列の実装はどうなっているかということですが、これはallocaに依存しているようです。というのは、

同一の関数の中で可変長配列とallocaの両方を使うと、 可変長配列の領域が解放されるときに、 その可変長配列が割り当てられたあとにallocaによって割り当てられた領域も すべて解放されることになります

[C言語ファミリに対する拡張機能より引用]

というところからの推測です。そして、allocaの実装がどうなっているかというと、多くの場合スタック上にメモリを確保していると思われます。

こうすることにより、関数を抜けたときに領域が開放されるという仕様がより自然に実現できます。

そして、スタックポインタの操作だけですむgccの可変長配列の方がmallocによるメモリの動的確保より速いのは自明でしょう。

追記

結局のところ、ほらやっぱりC言語が遅い場合もあるんじゃないかと言われればそのとおりなのですが、じゃあ個別にmalloc/freeをすると間に合わない場合にどうするかというと、はじめに大きな領域を確保してそこから切り売りする俺malloc/俺freeを実装するわけです*1

もちろん、可変長配列が言語サポートされていれば嬉しいんですが、それはC99対応のコンパイラが普及するの(か?)を待たなくちゃあいけないですね。

*1 いや、gccのみで実装するなら可変長配列でもいいんですけどね。

今日の晩御飯

久しぶりですが、毎日とはいわないまでもそこそこ真面目にやってますよ?

きょうは、レバニラ炒め、ご飯、味噌汁、納豆。