Я попытался определить, что происходит при назначении перемещения фиксированного размера Eigen::Matrix
переменных с помощью следующего кода
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;
Этот код имеет вывод, который выглядит следующим образом
// Before
0x7ffee50bcee0 // from
1 2 3
0x7ffee50bcf00 // to
9 9 9
// After
0x7ffee50bcee0 // from
9 9 9
0x7ffee50bcf00 // to
1 2 3
Похоже, это указывает на то, что назначение перемещения выполняет «копирующий» обмен (который, как я ожидаю, будет на больше дороже, чем назначение копирования), поскольку адреса базовых данных не меняются, а значения меняются. Может кто-нибудь подтвердить это дело? Моя цель - определить, потерю ли я эффективность, если я создам класс с Eigen::Matrix
членом, который реализует назначение копирования, но не перемещает назначение (кроме любых потерь эффективности, которые я понесу из-за невозможности воспользоваться ленивой оценкой библиотеки Eigen, конечно).
Для дополнительной информации, если я переключу from
и to
на тип Eigen::VectorXd
, тогда я получу вывод, который выглядит следующим образом
//Before
0x558f77b8be70 // from
1 2 3
0x558f77b8be90 // to
9 9 9
// After
0x558f77b8be90 // from
9 9 9
0x558f77b8be70 // to
1 2 3
Это будет означать, что базовые указатели данных меняются при перемещении (и, следовательно, назначение перемещения более эффективно, чем назначение копирования для Dynami c Собственные матрицы).