2009-05-20 1 views
5

オブジェクトあたりの初期メモリ割り当ての束があれば、私はたくさんのシミュレーションを実行しています。シミュレーションはできるだけ早く実行する必要がありますが、割り当ての速度は重要ではありません。私は割り当て解除に関心がない。参照の局所性を最大限にするC++用の優れたカスタムアロケータはありますか?

理想的には、アロケータはすべてを連続したメモリブロックに配置します。 (これは時にはアリーナと呼ばれることもあります)

割り当てられたオブジェクトは多相であるため、フラットベクトルを使用することはできません。

私のオプションは何ですか?

答えて

5

あなた自身で作成してください。

は、あなたが始めることができる方法を確認するために私の古い質問を参照してください:

Improvements for this C++ stack allocator?

+0

これは良いスタートです。ありがとう。 deallocate()を書いたことがありますか? –

+0

アラインメントの問題を修正しましたか?どのようにシステムの必要な整列を得る必要がありますか? –

+0

@Neil、いいえ、私は割り当て解除を完了しませんでしたが、そのすべてのPODSを無視するか、そうでない場合は順番にそれを無視するのはかなり簡単です。配置の問題については、x86では問題ありません。そうであれば、最も近い16バイト境界に丸めます。 – Unknown

1

通常の技術は、固定ブロック割り当てです。参照:Lea,Robinson,Knowlton,Grunwald

編集:頻繁な割り当ておよび割り当て解除がある場合、固定ブロック割り当ては実際にはギャップを残すことがあります。一つのプロジェクトで私はクラスが異なるサイズの多くのサブオブジェクトを割り当てるかもしれないが、それらを連続しておく必要があるところで作業した。私たちは単純なメモリプールを使用した:オブジェクトのすべての内容に必要なすべてのメモリを一度に割り当て、それらの中にそれらを出す。

オブジェクトの内容の大きさを事前に把握していない場合は、メモリを順番に割り当てるプールアロケータを作成できます。つまり、それは保証します

Foo *a = new Foo(); 
Bar *b = new Bar; 
b == ((byte *)(a)) + sizeof(Foo); 

これは、オブジェクトのコンストラクタで発生するすべての割り当てが連続していることを保証します。オブジェクトの割り当てが解除されると、大きくてぎこちないギャップが発生するため、毎回断片化を解消する必要がありました。そうであっても、純スピードの利得は重要であった。

+0

私は固定ブロック割り当てが私が望むものではないと思います。割り当ては高速ですが、参照の局所性を最小限に抑えるようにあらゆるところにギャップを残します。割り当てのスピードは気にしませんが、リファレンスのローカリティについては気をつけてください。 –

+0

私はそれらを参照の局所性を得るために使用します(キャッシュは私が扱うアーキテクチャ上の生命です)。明らかにオブジェクトの割り当てを解除していない方が効果的です。また、必要に応じて間隔を置いてプール内のオブジェクトを最適化することもできます。 – Crashworks

+0

アライメントはどのように扱いますか? –

0

これは非常に大きなテーマです。ちょうどwikipediaです。 具体的な例はAlexandrescuの本にあり、彼のLoki libraryに実装する必要があります。 GCCにはstd::allocatorの実装もいくつか付属しています。

4

あなたは線形アロケータを使用することができます割り当て解除を気にしないので。膨大な量のメモリを前面に割り当て、開始点へのポインタを格納します。 malloc(x)は、割り当てポインタをxバイト分だけ前進させ、ポインタの古い値を返します。delete(x)は、スタブアウトされます。ここで言及したように、もう1つのポスターには既にan implimentation

が割り当てられています。割り振りはできるだけ詰まっており、割り当ては非常に高速で、割り当てられた順番でメモリが返されます。あなたのシミュレーションが完了したら、アロケータのポインタをメモリの先頭にリセットし、アロケータの外側からその内部のオブジェクトまでのポインタをクリアするだけです。

プールアロケータは、オブジェクトをヒープより速く削除したいが、データをメモリに密集させず、あまり速くない場合に最適です。それらにはboost:poolを使用してください。これは、あなたが言うように - レベルを格納するためのxバイトを持っていれば、ゲームのための素晴らしい選択です - そして、あなたは同時にたくさんの捨て場を放棄したいです。

メモリパフォーマンスに関心がある場合は、What Every Programmer Should Know About Memory-PDFを参照してください。参照の局所性やパフォーマンスへの影響などを扱います。具体的には、一緒に使用されるオブジェクトの種類ごとにプールを作成したり、構造体の配列ではなく配列の構造体としてオブジェクトを宣言したりすることができます。

+0

これは私が欲しいものです。だから、私はそれを自分で書く必要があります。私はそれが "難しい"ではないことを知っていますが、それを自分で書くことはデバッグを意味し、間違いを見つけるのは難しいかもしれません。 あなたが指摘したように、私は "Unknown"のソリューションから始めると思います。 PDFをありがとう。 –

1

Dave HansonのC Interfaces and Implementationsには非常に素晴らしいアリーナベースのアロケータが含まれています。メモリが提供されている場合、オブジェクトにはメタデータは格納されず、連続した空き領域から割り当てられます。したがって、これはあなたが望むほどの地域性があります。

関連する問題