2012-12-17 61 views
2

我正在使用使用Eigen矩陣庫的代碼。我注意到所有通過該代碼,有訪問者如下:訪問特徵矩陣的行向量時複製或引用

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

使用訪問器返回一個const ref是不是更好? Eigen有可能嗎?或者,也許只是返回指向內部的浮動指針開始並將其轉換爲向量(當然假設匹配行主佈局)?

+0

如果你擔心表現,那麼不要。先嚐試一下。有足夠的人使用Eigen來確保它足夠快。另外,你不知道向量是如何實現的。無論如何,它們可能只是淺拷貝或只是在內存中對ptr進行typedef。 – RedX

+0

這就是爲什麼我問。我不知道。足夠的人使用它,所以我不必擔心可能是真實的,但我仍然想要一個技術性的答案。 – Wilbert

回答

3

在Eigen中,mymatrix.row(vertex_index)返回一個Block(假設mymatrix是一個Matrix3f)。 Block對象本質上是指向原始數據的指針。在你的情況下,這個代理被複制到RowVector3f中。幸運的是,對於這樣的小尺寸固定尺寸的對象,編譯器會輕鬆優化這些額外的副本。所以我不打擾。

在更一般的情況下,我會重寫V方法來返回一個MatrixXf :: RowXpr(這是一個適當的typedef塊< ...>)。

-1

我不知道這個庫,但我確實使用了這個技術,即返回對象,並且通過值返回它們,而不是通過引用。這是爲了安全 - 當您按價值返回一部分數據時,您無法更改原始數據。

此外,使用對象而不是指向數據的指針使代碼更友好,語法更高。

+1

你也不能改變'const&'。 – Pubby

相關問題