Второй аргумент std::vector

Глядя на vector, я понял, что я никогда не использовал второй аргумент при создании векторов.

std::vector<int> myInts; // this is what I usually do
std::vector<int, ???> myOtherInts; // but is there a second argument there?

Глядя на ссылку выше, она говорит, что она предназначена для:

Объект Allocator, который будет использоваться вместо создания нового.

или, что касается этого:

Allocator: тип объекта-распределителя, используемый для определения модели распределения хранилища. По умолчанию используется шаблон класса распределителя для типа T, который определяет простейшую модель распределения памяти и не зависит от стоимости.

Я предполагаю, что это связано с чем-то с управлением памятью. Однако я не уверен, как это использовать.

Любые указатели на это?

Ответ 1

Распределитель по умолчанию std::allocator<> будет обрабатывать все распределения, сделанные std::vector<> (и другими). Он будет делать новые выделения из кучи каждый раз, когда потребуется новое распределение.

Предоставляя настраиваемый распределитель, вы можете, например, выделить большой кусок памяти спереди, а затем разрезать его и раздавать меньшие куски, когда необходимы отдельные распределения. Это значительно увеличит скорость распределения, что хорошо, например, в играх, ценой повышенной сложности по сравнению с распределителем по умолчанию.

Некоторые реализации типа std имеют внутреннее хранилище на основе стека для небольших объемов данных. Например, std::basic_string<> может использовать так называемую небольшую оптимизацию строк, где только строки длиной до некоторой фиксированной длины, например 16 символов (только пример!), Получают выделение из распределителя, в противном случае используется внутренний массив.

Ответ 2

Пользовательские распределители редко используются в общем случае. Некоторые примеры того, где они могут быть полезны:

  • Оптимизация для конкретной схемы распределения. Например, параллельная программа может предварительно выделить большой кусок памяти с помощью стандартных средств в начале выполнения задачи, а затем сбрасывать куски с нее, не блокируя глобальный мьютекс кучи. Когда задача завершена, весь блок памяти может быть удален. Чтобы использовать этот метод с контейнерами STL, можно использовать пользовательский распределитель.

  • Встроенное программное обеспечение, в котором устройство имеет несколько диапазонов памяти с различными свойствами (кэшированные/не кэшированные, быстрые/медленные, нестабильные/постоянные и т.д.). Пользовательский распределитель может использоваться для размещения объектов, хранящихся в контейнере STL, в определенной области памяти.

Ответ 4

Аллокаторы (STL) помогают вам управлять памятью для ваших объектов в векторном классе. вы можете использовать пользовательский распределитель для разных моделей памяти (и т.д.).