シンプルなインクリメンタルヒープアロケータを単純なコンパイルデフラグツールと組み合わせて使用する自己最適化メモリマネージャを記述しようとしています。C++ヒープアロケータ&STLのデフラグ
ラフスキームは、下位のメモリアドレスから上に向かってブロックを割り当て、最上位のメモリアドレスから始まるブック情報を下向きに保つことです。
メモリマネージャはスマートポインタを返すでしょう - ブーストのintrusive_ptrはブックストアの構造体にとって最も明白なようです。実際のメモリブロックを指しているので、ブロックが簡単に移動できるように間接的なレベルを与えます。
デフラグツールは、「世代」のブックマークからヒープを圧縮して処理を高速化し、一度に固定量のメモリを最適化するだけです。ブロック自体への生ポインタは、次のデフラグ・パスまで有効であり、そのような時間がパフォーマンスを改善するまで、自由に渡すことができます。
この特定のアプリケーションはコンソールゲームプログラミングなので、各フレームの最初または最後に、デフラグパスを比較的安全に行うことができます。
私の疑問は誰もがこの種の割り当て方式をSTLと組み合わせて使用していると思っています。私はstd :: list < intrusive_ptr>がintrusive_ptrレベルで動作しているのを見ることができますが、stlリストノード自体の割り当てについては、intrusive_ptrの次の/ prevポインタをオーバーライドするにはどうしたらいいですか?標準のヒープアロケータは、このより動的なものに沿っています。
わかりません。下にあるブロックを移動するための小さなsmart_ptrハンドルがあります。しかし、基礎となるブロックにポインタがあるとどうなりますか?これらのptrsをsmart_ptrsにするにはどうすればよいですか? – jmucchiello
@jmucchiello:アロケータはメモリブロックを純粋にユーザーに返すだけで、メモリのピースを持つクラスを作成していれば、そのポインタにsmart_ptrsを使用することができます。とにかく、クラスを制御し、intrusive_ptrsを使用して他のオブジェクトを '所有'するため、これは私のケースではまったく問題ありません。 – user176168