FC2ブログ

スポンサーサイト

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

FixedAllocator高速化版

FixedAllocator高速化版。

Pythonだったかなんかのスクリプトのメモリアロケータをヒントに製作。
Modern C++ の FixedAllocatorの弱点(?)であるランダムなメモリ確保/開放もO(1)で動く。

肝はチャンクのバッファのアライメントを4KBなどの大きいものにして(これがスクリプトのメモリアロケータと一緒)、ブロックからチャンクの検索をO(1)で出来るようにしたことと(ソース内のマクロBLOCK2CHUNK)、チャンクをフリーブロックを持つものと持たないものの2つに分けて管理していること。

高速は高速なんだけど、VC90の _aligned_malloc は大きいアライメントでの動作が余りよろしくないらしく、メモリ上でのチャンクの配置間隔がかなり広くとられる。具体的にはバッファサイズが2KB超4KB以下、アライメントが4KBだった場合、8KB間隔で配置される。
4KBのメモリを4KBアライメントで2つ取ると下記のような感じで間隔がすごい開く。
...|use 4KB|free 4KB|use 4KB|free 4KB|...
多分サイズ+アライメント以上の空き領域を単純に探してると思われる。

コンストラクタ
FixedAllocator( size_t blockSize, size_t blockAlign, size_t chunkSize, size_t chunkAlign );
は、16byteのブロックを16byteアライメントでとる場合、
FixedAllocator(16,16,4<<10,4<<10)
とか書く。chunkAlignは大き目の2の累乗じゃないと意味が無い。
エラー処理とかしてないので2の累乗以外を入れるとばぐる。

ヘッダ

定義
スポンサーサイト

コメントの投稿

非公開コメント

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

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

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