Перемещение семантики - это передача ресурсов, а не копирование их, когда больше не требуется исходное значение.
В C ++ 03 объекты часто копируются, только для их уничтожения или назначения перед любым кодом снова использует значение. Например, когда вы возвращаетесь по значению из функции, если только RVO не запускается - возвращаемое значение копируется в стек стека вызывающего, а затем выходит за пределы области действия и уничтожается. Это всего лишь один из многих примеров: см. Pass-by-value, когда исходный объект является временным, такие алгоритмы, как sort
, которые просто переупорядочивают элементы, перераспределение в vector
при превышении capacity()
и т. Д.
Когда такие пары «копировать / уничтожать» дороги, это обычно потому, что объекту принадлежит какой-то тяжеловесный ресурс. Например, vector<string>
может владеть динамически выделенным блоком памяти, содержащим массив объектов string
, каждый со своей собственной динамической памятью. Копирование такого объекта является дорогостоящим: вам необходимо выделить новую память для каждого динамически выделенного блока в источнике и скопировать все значения в. Затем вам нужно освободить всю память, которую вы только что скопировали. Однако перемещение большого vector<string>
означает просто копирование нескольких указателей (которые относятся к блоку динамической памяти) к месту назначения и обнуление их в источнике.