访问特征矩阵的行向量时复制或引用

时间:2012-12-17 10:31:09

标签: c++ performance reference eigen

我正在使用使用Eigen矩阵库的代码。我注意到,通过该代码,有以下访问器:

RowVector3f V(size_t vertex_index) const
{
    return mymatrix.row(vertex_index);
}

使用返回const ref的访问器不是更好吗?这与Eigen有可能吗?或者只是将指向内部浮点数的指针返回到行开始并将其转换为向量(当然假设匹配行主要布局)?

2 个答案:

答案 0 :(得分:3)

在Eigen中,mymatrix.row(vertex_index)返回一个Block(假设mymatrix是一个Matrix3f)。 Block对象本质上是指向原始数据的指针。在您的情况下,此代理将复制到RowVector3f中。幸运的是,对于如此小的固定大小的对象,编译器将很容易地优化掉这个额外的副本。所以我不打扰。

在更一般的情况下,我重写V方法以返回MatrixXf :: RowXpr(这是一个适当的typedef到Block< ...>)。

答案 1 :(得分:-1)

我不知道这个库,但我确实使用了这个技术,即返回对象,并按值而不是通过引用返回它们。这是为了安全 - 当您按值返回部分原始数据时,无法更改原始数据。

此外,使用对象而不是指向数据的指针使代码更具语法友好性和高级别。