Ответ 1
Ну, std::allocator
и сама концепция Allocator были изобретены для решения таких проблем, как ближний и дальний указатели, или, как правило, указатели на разные адресные пространства. И они справляются с этим... адекватно. Распределитель определяет используемый тип указателя.
Они также могут использоваться для работы с разными распределителями памяти, хотя количество шаблонов для этого несколько ошеломляет.
И, наконец, контейнер, поддерживающий распределитель, может сочетаться с распределителем, использующим преимущества, которые предоставляют вспомогательный распределитель для дочерних элементов, что может помочь уменьшить накладные расходы.
Первая точка в настоящее время в основном устарела, хотя ее можно использовать со второй точкой, чтобы иметь контейнер с отображением-адресом-инвариантом в сегменте разделяемой памяти или файл.
Вторая точка может использоваться для использования специализированных распределителей, хотя интерфейс для этого не очень хорош. Пример, когда я использовал его для взломать безопасный std::basic_string
.
И последний пункт редко используется.
Единственным огромным недостатком концепции Allocator, как определено, является тот факт, что он использует шаблон. Все использование уже проходит через std::allocator_traits<Allocator>
, поэтому оно просто приводит к тому, что типы невольно становятся почти одинаковыми, не было ли аргумента шаблона для распределителя.
А также к большому дублированному коду для надлежащего переподключения распределителя.