矢量可能會消耗更多的內存,因爲它通常分配給存儲數據和矢量每次都會調用默認的構造函數和析構函數爲Eigen::Vector3f
你調整它的大小比需要更多的空間。 AFAIK,默認Eigen::Vector3f
構造函數是空的,所以它會在發佈版本中花費你零(但是由於這個和調試迭代器,你可能在調試版本中遇到性能問題)。在另一邊,Eigen::Matrix
將每次調整其大小(它也將內容複製,就像std::vector
如果你使用conservativeResize)時重新分配內存,這是緩慢的。
Howewer,我還是建議你使用矢量,因爲它更方便。您可以動態添加元素,調整其大小而不重新分配,在矢量上使用標準算法會更簡單。如果你想可以肯定,你的載體不消耗比需要更多的內存,你可以用這種伎倆來調整它的大小:
std::vector<Eigen::Vector3f> vertices;
vertices.swap(std::vector<Eigen::Vector3f>(size, Eigen::Vector3f()));
還是看shrink_to_fit
是的,你可以使用memcpy複製數據有效地使用這兩種表示。但使用std::copy
將在發佈版本中以相同的性能完成相同的工作(有時它甚至被具有memcpy
的編譯器取代)。
Howewer,如果你還是不滿意的表現,這裏有技巧我做了爲自己做出在這種情況下的決定:
- 如果你要頻繁調整頂點數組(或添加刪除元素) - >用
std::vector
去避免頻繁重新分配。
- 如果在頂點數組中存儲大量數據塊 - >請使用
Eigen::Matrix
以避免過多的內存消耗。
- 如果你不滿足於在調試模式下的表現(這將幸好是真實的,如果你經常在你的頂點數組處理數據) - >去
Eigen::Matrix
,stl
調試迭代器可以毀掉性能(僅適用於MSVC真)
也可以考慮boost::shared_array(scoped_array),它們專門用來存儲大塊數據而不消耗額外的內存。在你的場景中使用它們更有意義。
這個答案含有很好的提示;不幸的是,我只能接受一個答案。 – Wilbert