関数 malloc や 関数 free , new や delete による 動的なメモリ管理にはオーバーヘッドがかかります. 1 度のメモリ確保にかかるオーバーヘッドは 小さいものですが,1,000,000 個を超える領域を 確保する状況であれば,秒単位の時間を要する可能性もあります. たかが 1 秒, されど 1 秒ですから, 時間を気にしているときは改善したくなります.
たとえば,短い文字列を大量に作成する場合, メモリ確保にかかるオーバーヘッドは(個人的に)とても気になります.
SZPool は, 文字列用のメモリ確保を高速化するためのライブラリです. ブロック単位で確保したメモリに複数の文字列を格納することで, メモリ確保の回数を削減してオーバーヘッドを抑えます. ブロックの最小サイズは,メモリ管理用のオブジェクトを 作成する際に指定できるようになっています.
利用や再配布などに関する制限はありません. 自己責任にてお使いください.
szpool-101.tgz - 1,905 bytes
szpool-100.tgz - 1,769 bytes
Visual Studio 2005 と MinGW gcc 3.4.5 で動作確認をしています.
szpool.h からの抜粋になりますが, 以下のクラスを提供します.
// テンプレートには文字の型を指定する. template <typename Letter> class StringPool::Pool { // 文字列を格納するブロックのサイズを指定する. Pool(size_t block_size); // 領域の割り当てだけをおこなう. Letter *alloc(size_t size); // 文字列の複製を作成して返す. template <typename LetterFrom> Letter *add(const LetterFrom *s, size_t size); template <typename LetterFrom> Letter *add(const LetterFrom *s); // 登録されている文字列の数を返す. size_t num_strs() const; // 文字列を登録するために確保されている領域のサイズを返す. size_t total_size() const; };
クラス StringPool::Pool は, テンプレートとして文字の型 Letter を受け取ります. コンストラクタは使用するブロックのサイズ block_size を受け取るようになっていて, 登録する文字列がブロックに収まらないほど長い場合, 例外的にブロックより大きな領域を確保することで対処します.
関数 alloc は, 指定されたサイズの領域を確保して,そのアドレスを返します. 関数 add は,受け取った文字列を 関数 alloc で確保した領域に複製して, そのアドレスを返します. 関数 num_strs により 確保した領域の数を取得することが可能で, 関数 total_size により 確保した領域の合計サイズ( byte )を 取得することが可能です.
szpool_test.cpp を参考にしてください.
今のところ予定はありません.
特にありません.