なんだってー!!!!(;゚д゚) (゚д゚;(゚д゚;)
いや、過言かもしれませんが、C++の存在がdlmallocを書く切っ掛けになったのは確かです。
dlmallocは現在はLinuxなどのデフォルトのmalloc実装ではありませんが、
dlmallocは本当に優れたアルゴリズムを持っています。
まずは「はじめに」の日本語訳を引用として載せておきます。(この記事自体は非常に古いもので現在のmallocの実装の詳細を反映してはいませんが、今なお使うに値するアロケータだと俺は信じますし、使っています)
http://g.oswego.edu/dl/html/malloc.html
はじめに
メモリアロケータはソフトウェア工学のインフラにおける興味深いケーススタディを形成します。
私はそれを1987年に書き始めて以来、維持と発展に努めてきました。(これは多くのボランティアの方々の助けがあってこそです)
このアロケータはいくつかの助けとなるユーティリティ関数と共に標準Cの関数であるmalloc(), free(), realloc()の実装を提供します。
このアロケータに名前を与えたことは一度もありません。
ただ、多くの人がこれを「Doug Lea's Malloc」もしくは略名で「dlmalloc」と呼びます。
このアロケータのコードはパブリックドメインに位置しています。
(それは
ftp://g.oswego.edu/pub/misc/malloc.cから利用可能です)
そして、とても広く使われています。
mallocのデフォルトバージョンとして幾つかのLinuxのバージョンで用いられたり、
幾つかの一般的に使われているソフトウェアパッケージの中で(ネイティブのmallocと置き換えられて)使われています。
他にも様々なPCの環境や組み込みシステム、私の知らないとても多くの場所で使用されました。
私はこのアロケータの最初のバージョンを何らかのC++プログラムを書いた後に書きました。
それはメモリの動的割り当てがうまく働く事を期待されたプログラムでした。
私は見つけてしまったのです。その環境でのアロケータが私の予想より遙かにゆっくりと動き、かつ(あるいは)、遙かに多くのメモリ領域を消費していることを。
これは私がそのプログラムを動かしていたシステム(主にSunOsとBSDの最新版)上のメモリアロケータの特性故でした。
私はこの挙動を打ち崩すためにまず多くのC++の上で動作する専用のアロケータを書きました。
様々なクラスでoperator newをオーバーロードするためです。
これらの幾つかはC++Report(1989)の記事の中で、コンテナクラスの為の領域割り当てテクニックとして紹介されているものです。
しかし、私はすぐに当時書いていた汎用的なプログラムに対して新しいクラスを追加する際に気付いたのです。
動的に割り当てられ、よく使われるような様々なクラスにとって、
それぞれに特別なアロケータを記述することが優れた戦略ではないと。
(1986年から1991年にかけて私はGNU C++ library.のlibg++における第一線に立つ作者でした)
より広い解決策を求められていたので、
非常に特別な場合を除いて、プログラマが専用のアロケータを記述する誘惑にとらわれないように
通常のC++/Cの負荷の下でよく働くアロケータを書く必要がありました。
この記事ではアロケータの為に必要になる主な設計目標と、アルゴリズム、および幾つかの実現に対する問題を記載します。
コードの方に目を通して頂ければより詳細なドキュメントを見つけることができるでしょう。
コンテナやクラスごとに専用のアロケータを書いてしまう誘惑というのは確かに存在すると思います。
ですが、
非常に特別な場合を除いて、プログラマが専用のアロケータを記述する誘惑にとらわれないように
書かれたのがdlmallocなのです。
これは想像に過ぎませんが、小さなクラスなどを頻繁に作ろうとするC++だからこそ、既存のアロケータでは駄目だという結論になったのではないかと自分は考えます。
通常C++はCよりも細かく、そして頻繁にnew/deleteをするでしょうから。
その戦略に対する答えの一つが「各個クラスやコンテナ別にアロケータを書く」ということではありますが、
賢く働くアロケータがあればプログラマは専用のアロケータを用意する必要はなくなるのです。
そして、これが1989年当時に行われたということは驚くべきことではないでしょうか?
2009年になっても多くのプログラマはこのdlmallocより劣ったプログラムを便利だと思って使っているのですから。
(意訳的なものも含めた翻訳なので、間違いなどあればお気兼ねなくお寄せください)