Второй аргумент в std :: vector - PullRequest
       23

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

10 голосов
/ 14 декабря 2010

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

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

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

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

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

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

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

Есть ли какие-либо указания по этому поводу?

Ответы [ 5 ]

4 голосов
/ 14 декабря 2010

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

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

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

2 голосов
/ 14 декабря 2010

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

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

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

1 голос
/ 14 декабря 2010

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

1 голос
/ 14 декабря 2010

Может быть, это поможет: http://www.codeguru.com/cpp/cpp/cpp_mfc/stl/article.php/c4079

Вы можете попробовать Google для: stl allocator .

0 голосов
/ 14 декабря 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...