I have tried to determine what happens in move assignment of fixed size
Eigen::Matrix variables with the following code
Eigen::Vector3d from; Eigen::Vector3d to; from << 1, 2, 3; to << 9, 9, 9; std::cout << from.data() << std::endl; std::cout << from.transpose() << std::endl; std::cout << to.data() << std::endl; std::cout << to.transpose() << std::endl; to = std::move(from); std::cout << from.data() << std::endl; std::cout << from.transpose() << std::endl; std::cout << to.data() << std::endl; std::cout << to.transpose() << std::endl;
This code has output that looks like this
// Before 0x7ffee50bcee0 // from 1 2 3 0x7ffee50bcf00 // to 9 9 9 // After 0x7ffee50bcee0 // from 9 9 9 0x7ffee50bcf00 // to 1 2 3
This would seem to indicate that move assignment does a "copying" swap (which I would expect to be more expensive than a copy assignment) since the addresses of the underlying data do not change but the values do. Can someone confirm this is the case? My goal is really to determine whether I will be losing efficiency if I make a class with an
Eigen::Matrix member that implements copy assignment but not move assignment (other than any efficiency losses I would incur from the inability to take advantage of the lazy evaluation of the Eigen library of course).
For additional reference, if I switch
to to be of type
Eigen::VectorXd then I get output that looks like this
//Before 0x558f77b8be70 // from 1 2 3 0x558f77b8be90 // to 9 9 9 // After 0x558f77b8be90 // from 9 9 9 0x558f77b8be70 // to 1 2 3
This would indicate that the underlying data pointers are being swapped in the move (and therefore move assignment is more efficient than copy assignment for dynamic Eigen matrices).