バックグラウンド
これは、ゲーム エンジンのメモリ マネージャー用です。私はfreelist
実装しており、これらの場合はコンパイル時のリストが必要です。(たとえば、MPL または融合ベクター)。はfreelist
割り当てサイズに対応し、定数より小さいサイズのオブジェクトを割り当て/割り当て解除すると、対応する に移動しfreelist
ます。
結局のところ、これは小さなオブジェクトが一定時間の割り当てと一定時間の割り当て解除をグローバルに償却したことを意味します。(わーい。)
問題
問題は必要な型を生成することなので、最終的には Fusion を使用してそれらの型をインスタンス化する可能性があります。使用されているタイプは次のとおりです (短縮など):
template <size_t N>
struct data_block
{
size_t mSize; // = N
char mData[N];
};
template <typename T, size_t ElementsPerPage,
template <typename> class Allocator = std::allocator >
class freelist { /* ... */ };
template <typename T>
class callocator; // allocator that uses malloc/free
は、最小値から最大値までの 2 のべき乗サイズのfreelist
を管理します。data_block
だから私が欲しいのは:
static const size_t MinimumSmallSize = 4; // anything smaller gets rounded up
static const size_t MaximumSmallSize = 512; // anything bigger goes to the large allocator
static const size_t ElementsPerPage = 4096;
// mpl magic
これを生成するには:
typedef boost::mpl::vector<
freelist<data_block<4>, ElementsPerPage, callocator>,
freelist<data_block<8>, ElementsPerPage, callocator>
// ...
freelist<data_block<256>, ElementsPerPage, callocator>
freelist<data_block<512>, ElementsPerPage, callocator>
> free_list_collection;
明らかに、これを手動で行うこともできますが、より一般的で微調整可能なインターフェイスのために、それは避けたいと思います。コードでの Fusion ベクターの使用も、ハードコードされたメンバーよりも簡単です。
質問
これについて最善の方法がわかりません。これまで MPL を広範囲に使用したことはありません。何か案は?範囲を作ったり、remove_if
2 の累乗ではないなど、いくつかの悪いアイデアがありましたが、確かにそれは最善ではありません。代わりに、毎回倍増して結果ベクトルにプッシュする再帰的なものでしょうか? どうすればいいのかわかりません。