Если уже выделено достаточно места, объект является копией, созданной из аргумента на месте. Когда памяти недостаточно, вектор будет увеличивать свой внутренний буфер данных в соответствии с некоторой геометрической прогрессией (каждый раз новый размер будет k*old_size
с k > 1
[1] ) и все объекты, присутствующие в исходный буфер будет затем перемещен в новый буфер. После завершения операции старый буфер будет выпущен в систему.
В предыдущем предложении Move не используется в техническом Move-конструкторе / Move-Assignment смысле, они могут быть Move или скопировано или любая эквивалентная операция.
[1] Увеличение с коэффициентом k > 1
обеспечивает постоянную амортизированную стоимость push_back
. Фактическая константа варьируется от одной реализации к другой (Dinkumware использует 1,5, gcc использует 2). Амортизированная стоимость означает, что даже если очень часто один push_back
будет очень дорогим (O(N)
от размера вектора в то время), эти случаи случаются достаточно редко, чтобы стоимость всех операций по всему набору вставок является линейным по количеству вставок, и, таким образом, каждая вставка в среднем постоянных затрат)