FC2ブログ

スポンサーサイト

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

SmallObj.cppの覚書その2

http://loki-lib.sourceforge.net/html/a00671.html

00168 class FixedAllocator
    固定サイズアロケータ。チャンクの検索さえ入らなければ高速。確保/開放がLIFOになってれば検索がほぼ最小になるので速い。
    ランダムな確保/開放の性能は微妙。ブロックの最小サイズは1byte。それはすげえ。けどインデックスになってるから除算とか入る。

00176 void DoDeallocate( void * p );
    ブロックpの解放。deallocChunk_がpのチャンクである必要が在る。
    解放後にdeallocChunk_が完全に空(使用中のブロックを持っていない)であり、かつemptyChunk_が非NULLであれば
    そのチャンクを解放する。また解放時に、allocChunk_が満杯か、もしくは解放するチャンクであればallocChunkを
    空なチャンクに差し替える。

00183 bool MakeNewChunk( void );
    新しいチャンクの追加。成功すればtrue,失敗すればfalse。
    Chunk::Initが出すかもしれない例外をキャッチする。
    allocChunk_は新しく作ったチャンクに。deallocChunk_はchunks_の先頭のチャンクになる。
    chunks_の拡張→チャンクの初期化→chunks_への追加、と処理を行う。
    push_backしたあとチャンクの初期化をやると、初期化に失敗したときにそのチャンクを消す手間があるので、それをなくすためにこの順番でやってると思われる。

00197 Chunk * VicinityFind( void * p ) const;
    pが属しているチャンクを返す。見つからなければNULL。
    deallocChunk_から前後に配置されているチャンクを順番に検索する。LIFOに基づいてれば速いそうな。

00200 FixedAllocator(const FixedAllocator&);
00202 FixedAllocator& operator=(const FixedAllocator&);
    コピー防止。

00205 typedef std::vector< Chunk > Chunks;
    Chunkのリスト。vector使ってるのは検索を高速化するためだと思われる。

00207 typedef Chunks::iterator ChunkIter;
00209 typedef Chunks::const_iterator ChunkCIter;
    イテレーター。

00212 static unsigned char MinObjectsPerChunk_;
    チャンク当たりの最小ブロック数。8。

00215 static unsigned char MaxObjectsPerChunk_;
    チャンク当たりの最大ブロック数。インデックスの最大値である255。

00218 std::size_t blockSize_;
    ブロックひとつ当たりのサイズ。

00220 unsigned char numBlocks_;
    確保(ユーザーに渡した)ブロック数。

00223 Chunks chunks_;
    Chunkのリスト。    

00225 Chunk * allocChunk_;
    最後にブロックを確保したチャンク。高速に動作させるためのキャッシュ。フリーブロックを持っているとは限らない。

00227 Chunk * deallocChunk_;
    最後にブロックを解放したチャンク。高速化の為にFixedAllocator::VicinityFindで利用されてる。

00229 Chunk * emptyChunk_;
    空なチャンクがあればこの変数に格納される。この変数が非NULLの状態でさらに空チャンクが発生した場合はそのチャンクが解放される。

00233 FixedAllocator();
    コンストラクタ。変数の初期化のみ。

00236 ~FixedAllocator();
    DO_EXTRA_LOKI_TESTが定義されているときに TrimEmptyChunk() の呼び出し。
    保持しているチャンクに対してChunk::Releaseの呼び出し。

00239 void Initialize( std::size_t blockSize, std::size_t pageSize );
    初期化。
    ブロックサイズはそのまま。ページサイズに入りうるブロックの数を求めて
    MinObjectPerChunk_とMaxObjectsPerChunk_でクランプしてnumBlocksに入れる。

00244 void * Allocate( void );
    メモリの確保。フリーブロックを持つチャンク、allocChunk_のChunk::Allocを呼び出す。
    allocChunk_がNULLか満杯ならば、フリーブロックをもつチャンクを線形検索する
    それでもフリーブロックを持つチャンクが見つからなければMakeNewChunkを呼び出す。MakeNewChunkに失敗すればNULLが返る。

00251 bool Deallocate( void * p, Chunk * hint );
    hintが非NULLならそのチャンクを、そうでなければFixedAllocator::VicinityFindから取得したチャンクを
    deallocChunk_に設定しDoDeallocateを呼び出す。
    戻り値は解放が成功すればtrue、失敗すればfalse。ポインタpが指定されたチャンクから取得したものでなければ失敗。

00254 inline std::size_t BlockSize() const { return blockSize_; }
    ブロックサイズの取得。

00260 bool TrimEmptyChunk( void );
    空な(余分な)チャンクを消す。

00267 bool TrimChunkList( void );
    チャンクリストから余分な領域を削る。

00272 std::size_t CountEmptyChunks( void ) const;
    空(使用中のブロックを持っていない)なチャンクの個数を返す。
    emptyChunk_が非NULLであれば1,そうでなければ0。
    DO_EXTRA_LOKI_TESTSが定義されていれば、チャンクリストから空なチャンクの個数を検索する。
    0か1しか返らない。

00280 bool IsCorrupt( void ) const;
    整合性チェック。整合性が取れていなければtrue、取れてればfalse。
    チャンクを持っていないときは、chunks_のbegin()==end()はtrueか?CountEmptyChunksは0か?deallocChunk_,allockChunk_,emptyChunk_はNULLか?がチェックされる。
    チャンクを持っているときは、chunks_のbegin()<end()はtrueか?deallocChunk_,allocChunk_は、chunks_の中に含まれるか?emptyChunk_は空なチャンクか?全チャンクに対するChunk::IsCorruptの呼び出し、が行われる。

00286 const Chunk * HasBlock( void * p ) const;
    そのブロックが確保されたチャンクを返す。判定方法は全チャンクを線形検索し、各々のチャンクにChunk::HasBlockを呼び出すだけ。

00287 inline Chunk * HasBlock( void * p )
    const版を呼ぶだけ。
スポンサーサイト

コメントの投稿

非公開コメント

検索フォーム
ユーザータグ

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

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