C++ 为什么矩阵在通过Ref&;时被复制;在本征
我通过编写以下代码来测试变量是否被复制。这段代码来自官方文档: x和m1、m3和C的地址不同(我认为它们应该是相同的,因为我通过引用传递变量)。谁能给我解释一下原因吗 感谢@Nelfeal的回答。我试图用调试器来证明这一点。 下面是上述代码的调试信息。我们可以在m1和x中看到。“m_数据”共享同一地址0x329f800。 但是,有人能告诉我以下两段代码的区别吗?我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&”C++ 为什么矩阵在通过Ref&;时被复制;在本征,c++,eigen,eigen3,C++,Eigen,Eigen3,我通过编写以下代码来测试变量是否被复制。这段代码来自官方文档: x和m1、m3和C的地址不同(我认为它们应该是相同的,因为我通过引用传递变量)。谁能给我解释一下原因吗 感谢@Nelfeal的回答。我试图用调试器来证明这一点。 下面是上述代码的调试信息。我们可以在m1和x中看到。“m_数据”共享同一地址0x329f800。 但是,有人能告诉我以下两段代码的区别吗?我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&” void cov(常数参考x,常数参考y,参考C) 无效cov
void cov(常数参考x,常数参考y,参考C)
无效cov(常数参考和x、常数参考和y、参考C)
ARef
和AMatrixXf
仍然是不同的对象,它们将位于不同的地址。这并不意味着整个矩阵都被复制:只是创建了一个Ref
对象
我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&”
否,Ref
不是参考。至少从语言的角度来看不是这样。一个<>代码> REF是一个对象,它恰好被用在C++中。当您传递一个const Ref
时,您正在复制(通过转换创建)Ref
对象,因为您仍然在传递值,但希望您没有复制相应的T
(这就是重点)。当您传递一个常量Ref&
时,您没有进行任何复制,因为您是通过引用传递的
现在,一种方法是否优于另一种方法在很大程度上取决于Ref
到底是什么,我对这一点了解得不够,除了“它可能很小”之外,无法做出任何假设。因为这是一个要点:一般意义上的引用,无论是指针、C++引用还是“代码”> REF 对象,都应该是非常轻量级的,易于复制,因此,当您想在另一个函数中访问时,不必复制整个引用对象。
最后,您在const-Ref
和const-Ref&
之间选择什么可能无关紧要,特别是因为您很可能没有一个预先存在的Ref
对象要传递(因此无论如何都会在这两种情况下创建它)。然而,选择constref&
并没有什么坏处。并与C++中一般如何传递对象./P>一致。
A
Ref
和AMatrixXf
仍然是不同的对象,它们将位于不同的地址。这并不意味着整个矩阵都被复制:只是创建了一个Ref
对象
我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&”
否,Ref
不是参考。至少从语言的角度来看不是这样。一个<>代码> REF是一个对象,它恰好被用在C++中。当您传递一个const Ref
时,您正在复制(通过转换创建)Ref
对象,因为您仍然在传递值,但希望您没有复制相应的T
(这就是重点)。当您传递一个常量Ref&
时,您没有进行任何复制,因为您是通过引用传递的
现在,一种方法是否优于另一种方法在很大程度上取决于Ref
到底是什么,我对这一点了解得不够,除了“它可能很小”之外,无法做出任何假设。因为这是一个要点:一般意义上的引用,无论是指针、C++引用还是“代码”> REF 对象,都应该是非常轻量级的,易于复制,因此,当您想在另一个函数中访问时,不必复制整个引用对象。
最后,您在const-Ref
和const-Ref&
之间选择什么可能无关紧要,特别是因为您很可能没有一个预先存在的Ref
对象要传递(因此无论如何都会在这两种情况下创建它)。然而,选择constref&
并没有什么坏处。并与C++中一般如何传递对象./P>一致。
谢谢Nelfeal!受你答案的启发,我编辑了我的问题。但是你知道为什么我们要添加“&”,因为Ref本身已经是一个引用了吗?@JackieLam编辑。再次感谢你的详尽回答!现在我想我已经完全理解了。
Ref
包含一个临时对象(仅当传递的对象实际上不能通过传递指针来传递时才使用),这就是为什么它通常应该通过引用来传递。谢谢Nelfeal!受你答案的启发,我编辑了我的问题。但是你知道为什么我们要添加“&”,因为Ref本身已经是一个引用了吗?@JackieLam编辑。再次感谢你的详尽回答!现在我想我已经完全理解了。Ref
包含一个临时对象(仅当传递的对象不能通过传递指针来传递时才使用),这就是为什么它通常应该通过引用来传递。
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
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)