Фон
Это для менеджера памяти в игровом движке. У меня есть 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
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 и т. д., но, конечно, это не лучший вариант. Может быть, вместо этого что-то рекурсивное, которое каждый раз удваивается, подталкивая мой результирующий вектор? Я не уверен, как это сделать.
Loki::SmallObject
, вы можете уточнить некоторые параметры шаблона) и использует аналогичную систему из нескольких списков (по размеру). Проверьте заголовок в loki- lib.cvs.sourceforge.net/loki-lib/loki/include/loki/ и попробуйте прочитать объяснения в книге :) - person Matthieu M.   schedule 17.01.2010