Я проверил, копируются ли переменные, написав следующие фрагменты кода. Этот кусок кода взят из официальной документации: https://eigen.tuxfamily.org/dox/classEigen_1_1Ref.html
void cov(const Ref<const MatrixXf> & x, const Ref<const MatrixXf> & y, Ref<MatrixXf> C)
{
cout << "address of x : " << &x << endl;
cout << "address of C : " << &C << endl;
}
int main(int argc, const char * argv[]) {
MatrixXf m1(3,3);
MatrixXf m2(3,3);
MatrixXf m3(3,3);
m1 << 1,2,3,4,5,6,7,8,9;
m2 << 1,2,3,4,5,6,7,8,9;
m3 << 1,2,3,4,5,6,7,8,9;
cout << "address of m1 : " << &m1 << endl;
cout << "address of m3 : " << &m3 << endl;
cov(m1, m2, m3);
}
Вывод следующий.
address of m1 : 0x7ffeefbff4e8
address of m3 : 0x7ffeefbff498
address of x : 0x7ffeefbff370
address of C : 0x7ffeefbff308
Адреса x и m1, m3 и C разные (я предположил, что они должны быть одинаковыми, так как я передаю переменные через ссылку). Может ли кто-нибудь объяснить мне, почему?
Благодаря ответу @ Nelfeal. Я пытался использовать отладчик, чтобы доказать это.
Ниже приведена информация об отладке для приведенного выше кода. Мы могли видеть это в пределах m1 и x. «M_data» имеет один и тот же адрес 0x329f800.
Однако, может, кто-нибудь подскажет разницу между следующими 2 частями кода? Я предположил, что «Ref» уже является ссылкой, почему мы все еще должны добавить ссылку «&»?
void cov(const Ref<const MatrixXf> x, const Ref<const MatrixXf> y, Ref<MatrixXf> C)
void cov(const Ref<const MatrixXf> &x, const Ref<const MatrixXf> &y, Ref<MatrixXf> C)