背景
这是用于游戏引擎中的内存管理器。我有一个freelist
已实现,并且希望有一个编译时列表(如果有)。 (例如,MPL 或 Fusion 向量)。这freelist
对应于分配大小,当分配/释放大小小于常量的对象时,它们将转到相应的freelist
.
最后,这意味着全局小对象已经摊销了常量时间分配和常量时间释放。 (耶。)
Problem
问题是生成我需要的类型,因此我最终可能会使用 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
The freelist
的意志管理data_block
的 2 次幂大小,从最小值开始到最大值。所以我想要的是:
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 向量也应该比硬编码成员更简单。
Question
我不确定解决这个问题的最佳方法;我以前从未广泛使用过 MPL。有任何想法吗?我有一些糟糕的想法,比如制定一个范围,然后remove_if
它不是 2 的幂等,但肯定不是最好的。也许是递归的东西,每次都会加倍,推入我的结果向量?我不知道该怎么做。