Перепривязка в пользовательском распределителе STL с предварительно выделенным блоком
я собираюсь построитьпользовательский распределитель, предварительно выделив большой блок (массив) для храненияN
элементы некоторого классаT
, а затем просто увеличьте индекс внутри массива для запросов на выделение услуг.
Так как яне хотите любую инициализацию для элементов в предварительно выделенном блоке, что-то вроде этогот работа:
T buffer[N];
потому что в этом случаеT
конструктор будет вызываться дляN
элементы блока.
Так как я понимаю, чтоstd::aligned_storage
Безразлично»звонюT
конструктор, я подумал об использованииstd::aligned_storage
, что-то вроде этого:
std::aligned_storage< N * sizeof(T),
std::alignment_of::value
>::type buffer;
T* base = static_cast( static_cast(&buffer) );
И тогда распределитель может просто увеличивать базовый указатель, когда запрашивается выделение для T (до(base+N)
) и T можно построитьна месте (с размещениемnew
) когда нужно.
Я хотел бы использовать эту схему, чтобы определитьпользовательский распределитель для контейнеров STL, Тем не менее, мне кажется, что здесь может быть проблема дляперекомпоновка, На самом деле, если я правильно понимаю, распределитель STL должен поддерживать повторное связывание с типомT
к типуU
например, потому что контейнеры, какstd::list
(или другие основанные на узле контейнеры, такие какstd::map
) использовать распределители для выделенияузлы которые на самом деле не типаT
, но другого типаU
(содержащийT
и другие "заголовок» служебная информация для узла). Итак, будет ли вышеупомянутоеstd::aligned_storage
подход хорошо работает для переплета? Или (как я думаю) правильное выравнивание дляT
с делаетне подразумевать правильное выравнивание для другого другого типа?U
Как можно решить эту проблему?
Как я мог определить вышеупомянутоеbuffer
заставить это работать также для привязки к некоторому другому типу?U
Стоит ли атаковать эту проблему с другой точки зрения? Если да, то?