Фон
Это для менеджера памяти в игровом движке. Я реализовал freelist
, и хотел бы иметь список времени компиляции, если они. (Например, вектор MPL или Fusion). freelist
соответствуют размерам выделения, и при выделении / освобождении объектов размером меньше константы они переходят к соответствующему freelist
.
В конце концов, это означает, что небольшие объекты в мире амортизируют постоянное распределение времени и постоянное освобождение времени. (Yay.)
Задача
Проблема заключается в создании нужных мне типов, поэтому я могу в конечном итоге использовать 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
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 в коде также должно быть проще, чем жестко закодированные элементы.
Вопрос
Я не уверен, что лучший способ сделать это; Я никогда раньше не использовал MPL. Есть идеи? У меня было несколько плохих идей, таких как создание диапазона, тогда remove_if
это не степень 2 и т. Д., Но, конечно, это не лучше. Может быть, что-то рекурсивное вместо этого, которое удваивается каждый раз, вставляя в мой вектор результатов? Я не уверен, как это сделать.