Что делает распределитель по умолчанию, когда размер std :: vector изменяется (с помощью Reserve () или Resize ())? - PullRequest
1 голос
/ 21 января 2012

Что делает распределитель по умолчанию при изменении размера std :: vector (с помощью Reserve () или Resize ())?

  • Блок памяти, внутренне используемый std::vector фактически изменен размер.

  • Выделен новый фрагмент памяти, данные перемещены (например, std::move d) из старого фрагмента памяти в новый и, наконец, старую памятькусок освобожден.

Ответы [ 3 ]

5 голосов
/ 21 января 2012
Распределители

C ++ не поддерживают ничего, как C realloc.Всякий раз, когда vector требуется больше памяти, ему приходится выделять новое хранилище, переходить от старого к новому и освобождать старое.

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

Обратите внимание, что поддержка перемещения - это новое поведение в C ++ 2011. Предыдущие версии будут копироваться.

2 голосов
/ 21 января 2012

Когда вектор должен расти, в любой операции, включая изменение размера / резервирование, но также push_back, вставка ... Получается новый блок памяти, и элементы в старом динамическом массиве либо копируются, либо перемещаются на новое место (если тип поддерживает moving ).После этого старые элементы уничтожаются, а старая память освобождается.

Обратите внимание, что move имеет в стандарте особое значение, которое отличается от интуитивного значения: управление содержимое объектов (а не объектов) передается от исходного объекта к новому.

0 голосов
/ 21 января 2012

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

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