我通过编写以下代码测试了变量是否被复制。这段代码来自官方文档: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);
}
Run Code Online (Sandbox Code Playgroud)
输出如下。
address of m1 : 0x7ffeefbff4e8
address of m3 : 0x7ffeefbff498
address of x : 0x7ffeefbff370
address of C : 0x7ffeefbff308
Run Code Online (Sandbox Code Playgroud)
x 和 m1、m3 和 C 的地址不同(我认为它们应该相同,因为我是通过引用传递变量)。谁能向我解释为什么?
感谢@Nelfeal的回答。我尝试使用调试器来证明这一点。以下是上述代码的调试信息。我们可以在 m1 和 x 中看到这一点。“m_data”共享相同的地址0x329f800。

但是,有人可以告诉我以下两段代码之间的区别吗?我想“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)
Run Code Online (Sandbox Code Playgroud)
ARef和 aMatrixXf仍然是不同的对象,并且位于不同的地址。这并不意味着整个矩阵都会被复制:只是Ref创建一个对象。
我想“Ref”本身就已经是引用了,那为什么还要加上引用标记“&”呢?
不,aRef不是引用。至少从语言的角度来看不是。ARef是一个恰好在 Eigen 中使用的对象,就像 C++ 引用一样。当您传递 a 时const Ref<const T>,您正在制作对象的副本(通过转换创建),Ref因为您仍然按值传递,但希望您没有复制相应的对象T(这就是重点)。当您传递 a 时const Ref<const T>&,您并没有制作任何副本,因为您是通过引用传递的。
现在,一种方法是否比另一种更好很大程度上取决于 a 到底Ref是什么,而我对此了解不够,无法做出除了“它可能很小”之外的任何假设。因为这就是重点:一般意义上的引用,无论是指针、C++引用还是对象Ref,都应该是非常轻量级的,易于复制且快速,这样就不必复制整个当你想在另一个函数中访问它时引用的对象。
最后,您在const Ref<const T>和之间选择什么可能并不重要const Ref<const T>&,特别是因为您很可能没有预先存在的Ref对象可以传递(因此无论如何都会在这两种情况下创建它)。不过,去追求也没什么坏处const Ref<const T>&。并与 C++ 中对象的一般传递方式保持一致。
| 归档时间: |
|
| 查看次数: |
505 次 |
| 最近记录: |