C++ 为什么矩阵在通过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

我通过编写以下代码来测试变量是否被复制。这段代码来自官方文档:

x和m1、m3和C的地址不同(我认为它们应该是相同的,因为我通过引用传递变量)。谁能给我解释一下原因吗

感谢@Nelfeal的回答。我试图用调试器来证明这一点。 下面是上述代码的调试信息。我们可以在m1和x中看到。“m_数据”共享同一地址0x329f800。

但是,有人能告诉我以下两段代码的区别吗?我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&”

void cov(常数参考x,常数参考y,参考C)
无效cov(常数参考和x、常数参考和y、参考C)

A
Ref
和A
MatrixXf
仍然是不同的对象,它们将位于不同的地址。这并不意味着整个矩阵都被复制:只是创建了一个
Ref
对象

我认为“Ref”本身就是一个引用,那么为什么我们还要添加引用标记“&”

否,
Ref
不是参考。至少从语言的角度来看不是这样。一个<>代码> REF是一个对象,它恰好被用在C++中。当您传递一个
const Ref
时,您正在复制(通过转换创建)
Ref
对象,因为您仍然在传递值,但希望您没有复制相应的
T
(这就是重点)。当您传递一个
常量Ref&
时,您没有进行任何复制,因为您是通过引用传递的

现在,一种方法是否优于另一种方法在很大程度上取决于
Ref
到底是什么,我对这一点了解得不够,除了“它可能很小”之外,无法做出任何假设。因为这是一个要点:一般意义上的引用,无论是指针、C++引用还是“代码”> REF 对象,都应该是非常轻量级的,易于复制,因此,当您想在另一个函数中访问时,不必复制整个引用对象。 最后,您在
const-Ref
const-Ref&
之间选择什么可能无关紧要,特别是因为您很可能没有一个预先存在的
Ref
对象要传递(因此无论如何都会在这两种情况下创建它)。然而,选择
constref&
并没有什么坏处。并与C++中一般如何传递对象./P>一致。
A
Ref
和A
MatrixXf
仍然是不同的对象,它们将位于不同的地址。这并不意味着整个矩阵都被复制:只是创建了一个
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)