矢量可能会消耗更多的内存,因为它通常分配给存储数据和矢量每次都会调用默认的构造函数和析构函数为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