背景
这适用于游戏引擎中的内存管理器。我已经freelist
实现了,如果有这些,我希望有一个编译时列表。(例如 MPL 或 Fusion 向量)。'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
's将freelist
管理data_block
's 的 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 向量也应该比硬编码成员更简单。
问题
我不确定解决这个问题的最佳方法;我以前从未广泛使用过 MPL。有任何想法吗?我有一些糟糕的想法,比如制定一个范围,然后remove_if
它不是 2 的幂等,但肯定不是最好的。也许是递归的,每次加倍,推入我的结果向量?我不知道该怎么做。