Перепривязка в пользовательском распределителе 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

Стоит ли атаковать эту проблему с другой точки зрения? Если да, то?

Ответы на вопрос(1)

Ваш ответ на вопрос