Прежде всего, перемещение int
или указателя эквивалентно копии.То есть, если у вас было
struct X {
int a, b;
int* data;
};
, то его перемещение не будет дешевле, чем его копирование (пока игнорируем владение data
).По совпадению, вышесказанное в основном то, как выглядит std::vector
издалека: член size
и capacity
плюс некоторый указатель на кусок памяти.
Важная вещь о перемещении по сравнению с копированием - это то, что происходит с владением ресурсами .std::vector
владеет некоторой кучей памяти (data
).Если вы копируете a std::vector
, то эта кучная память должна быть скопирована, чтобы и оригинал, и копия могли владеть своими собственными данными.Но если вы переместите его, тогда только вектор перемещения должен сохранить владение, поэтому указатель data
может быть передан от одного к другому (вместо всех данных), потому что владение можетбыть «украденным» из перемещенного объекта.
Вот почему нет никакого конфликта в «перемещении» вашего объекта из стека в кучу: сам объект по-прежнему в основном копируется из одного места в другое, но ресурсы, которыми он (или его подобъекты, такие как big
) владеют, не копируются, а перемещаются («украдены»).