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