Suppose I have the following code:
#include <vector>
struct A {
int a;
int x;
};
int main() {
using namespace std;
A a1;
A a2;
vector<A> va;
va.push_back(a1);
va.push_back(move(a2));
}
I am aware that the elements of std::vector are stored contiguously, unlike a std::list. In the above code a2 is moved but is there really no copying of a2 to the vector va? What is the difference between va.push_back(a2); and va.push_back(move(a2));?
In your case, there is no effective difference, since you are using compiler-provided copy constructors. You would see a noticeable performance difference when using objects that are move-constructible, and take a lot of effort to copy. In that case, using
push_back(x)would create a copy of the object, whilepush_back(move(x))would tellpush_back()that it may “steal” the contents ofx, leavingxin an unusable and undefined state.Consider if you had a vector of lists (
std::vector<std::list<int> >) and you wanted to push a list containing 100,000 elements. Withoutmove(), the entire list structure and all 100,000 elements will be copied. Withmove(), some pointers and other small bits of data get shuffled around, and that’s about it. This will be lots faster, and will require less overall memory consumption.