станд.:: векторная вставка () перераспределение

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

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

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

6
задан 24 January 2010 в 14:13
поделиться

1 ответ

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

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

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

5
ответ дан 17 December 2019 в 04:47
поделиться
Другие вопросы по тегам:

Похожие вопросы: