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

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

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

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

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

или, как для этого:

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

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

Любые указатели по этому поводу?


person Default    schedule 14.12.2010    source источник
comment
Это пример определения вашего распределителя owm: stackoverflow. com/questions/3984588/c-stl-vector-reserve/   -  person    schedule 14.12.2010
comment
@skwllsp: это выглядит интересно. Вы хотите, чтобы я проголосовал, или вы собираетесь получить значок невоспетого героя? :)   -  person Default    schedule 14.12.2010
comment
Я забыл добавить один момент. Я использовал собственные распределители, когда мне нужно было узнать, сколько памяти потребляют мои контейнеры. Я написал об этом немного длинный ответ: stackoverflow.com/questions/2160300/   -  person    schedule 14.12.2010


Ответы (5)


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

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

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

person Johann Gerell    schedule 14.12.2010
comment
но в std::vector<int> разве int не попадают в стек? - person Default; 14.12.2010
comment
@По умолчанию - нет. std::vector (по умолчанию) размещает память в куче. - person atzz; 14.12.2010
comment
@Default: см. мое дополнение об оптимизации небольших строк. - person Johann Gerell; 14.12.2010
comment
@Йоханн Герелл: спасибо. Это лучший ответ на данный момент, я держу его открытым немного дольше, если появится больше ответов. - person Default; 14.12.2010
comment
@Johann, @atzz: std::vector по умолчанию динамически размещает свои элементы. Нет никакой гарантии, какую структуру данных использует это распределение. - person Lightness Races in Orbit; 22.06.2011
comment
@Tomalak: Нет гарантии, какую структуру данных использует это распределение - я сказал, что есть? - person Johann Gerell; 22.06.2011
comment
@Иоганн: Да. Вы сказали кучу и стек. - person Lightness Races in Orbit; 22.06.2011

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

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

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

person atzz    schedule 14.12.2010
comment
Так что, в принципе, я мог бы игнорировать это, пока мне не нужно беспокоиться об управлении памятью :) - person Default; 14.12.2010
comment
@ По умолчанию - в основном да. С другой стороны, вам, возможно, придется учитывать наличие второго параметра при передаче шаблона контейнера STL в качестве параметра шаблона шаблона в другой шаблон. Но обычно это тоже не частая ситуация. :) - person atzz; 14.12.2010

Возможно, это поможет: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

Вы можете попробовать найти в Google: stl allocator.

person Juraj Blaho    schedule 14.12.2010

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

person Arseny    schedule 14.12.2010

Привет, вы можете найти пример пользовательского распределителя http://www.codeproject.com/KB/cpp/allocator.aspx

person Sanja Melnichuk    schedule 14.12.2010