Как выполняется перемещение для матрицы фиксированного размера в библиотеке Eigen? - PullRequest
0 голосов
/ 11 апреля 2020

Я попытался определить, что происходит при назначении перемещения фиксированного размера 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 Собственные матрицы).

...