std :: vector insert () перераспределение - PullRequest
6 голосов
/ 24 января 2010

Я просматривал код std :: vector и нашел то, что не совсем понял. Когда емкость <размер () + 1, он должен перераспределить буфер, чтобы он мог вставить новый элемент. Что он делает (насколько я смог извлечь из кода): </p>

  • выделить новый буфер
  • копировать префикс старого буфера (0 - индекс вставки)
  • создать новый элемент в новом буфере
  • скопировать суффикс старого буфера (индекс - конец)
  • вызов деструктора для всех элементов в старом буфере
  • освободить старый буфер

Копия префикса и суффикса выполняется с помощью memmove, насколько я мог видеть. Разве memmove не является чистой двоичной копией данных? Это не вызывает конструктор элементов, не так ли? Мне было интересно, почему функция вызывает деструктор для элементов в старом буфере, если память только что перемещена, а не восстановлена ​​в новом буфере?

1 Ответ

5 голосов
/ 24 января 2010

Я просмотрел реализацию MSVC8 vector - не вижу memmove(). Предыдущие векторные элементы не перемещаются, они копируются и вызывается их копия c'tor, чтобы скопировать их в новый буфер (буфер размещается в одном выделении, элементы создаются с использованием размещения new).

Конечно, это только реализация MSVC, но именно так vector должен вести себя в соответствии со стандартом.

Однако, использование memmove иногда нормально - например, для std::vector<int> - и реализации STL могут специализироваться для этого случая. Возможно, вы пропустили шаблон 'ветвь', читающий исходный код.

...