Garmaine Staff asked 1 year ago

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