Я просматривал станд.:: векторный код и я нашли что-то, что я не вполне получил. Когда способность <размер () + 1 это должно перераспределить буфер, таким образом, это может вставить новый элемент. То, что это делает (насколько я смог извлечь из кода):
Префикс и суффиксная копия сделаны с memmove насколько я видел. Разве memmove не является чистой двоичной копией данных? Это не вызывает конструктора элементов, не так ли? То, что я задавался вопросом, почему делает вызов функции деструктор на элементах в старом буфере, если память просто перемещена, не восстановлена в новом буфере?
Я просмотрел реализацию MSVC8 vector
- я не вижу memmove()
. Предыдущие векторные элементы не перемещаются, они копируются, а их копия c'tor вызывается для копирования их в новый буфер (буфер выделяется в единичном выделении, элементы строятся с помощью размещения new).
Конечно, это только реализация MSVC, но именно так должен вести себя вектор
в соответствии со стандартом.
Однако, использование memmove
иногда нормально - например, для std::vector
- и реализации STL могут свободно специализироваться для этого случая. Возможно, вы пропустили чтение исходного кода шаблона 'branch'.