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 from
and 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).