FC2ブログ

スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。

固定サイズアロケータ

固定サイズのアロケータ(プール)
Modern C++ の SmallObj と Efficient C++ の MemoryPool に触発されて作成。

SmallObjは1~3byteのメモリ確保でもメモリの無駄が(あまり)出ないのが面白いと思った。確保した領域のポインタを受け取るのに4byte使うんだから本末転倒な気がするが。
MemoryPoolは1個ずつ領域を確保してた。単純にする為 or 部分的なメモリ開放をやりやすくする為 or 上位のアロケータへの依存度を上げる為 or プールするだけだから あたり?多分4番目。

チャンクの構造は以下のような感じ。
|ブロック|ブロック|...|次のチャンクへのポインタ|

ブロックに要素が一つ入る。ブロックのサイズは要求サイズとアライメントと最低限必要な容量から計算。

利点
・確保/開放が単方向リストの挿入/削除なのでかなり速い
・チャンクをまとめて確保しているので小さいオブジェクトでのメモリ効率が良い

欠点
・メモリ開放する仕組みが無い為メモリ使用量がピーク時のそれになる

欠点を解消する方法として「すべての要素がフリーなチャンクがN個あればチャンクを1つ開放する」や「全要素がフリーなチャンクを開放する関数を追加」がある。前者は構造が単純でなくなりそうだし、後者は純粋に重そう。

使用するオブジェクト数の最大数が判っていて、かつその最大数が平均的な使用量と大差がないようなシーンだとあまり意義が無かったりする。
メモリの確保量が常に一定なのも余り良くない。倍々にしていく(std::vectorと同じ)とかすれば上位のアロケータの呼び出し回数を減らせる。これは使用されるケースによるのでなんともいえないが。
あとメモリ破壊に弱そう。突き抜けた要素にNULLとか入れられて、それがフリーなタスクだったりした日には酷いことになりそう。


スポンサーサイト
検索フォーム
ユーザータグ

ICPC 2009 国内予選 ゲームプログラミング 

カテゴリ
最新記事
月別アーカイブ
最新コメント
最新トラックバック
リンク
上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。