C ++ vector <t> v,vector <t> * v,vector <t *> vec,哪个是最快的(或最有效的)?

时间:2015-05-17 06:28:33

标签: c++ pointers vector

我的一位朋友告诉我,就处理时间而言,指针的矢量比法线矢量更优选。 换句话说,前者(例如vector<int> *i)会比后者更快(例如vector<int> i)。

根据我的朋友的说法,原因是 内存分配将通过使用这种类型的向量来减少 vector<int> *i)。

但是,老实说,我不明白为什么,因为vector<int> *i需要两倍于vector<int> i的内存地址(只要这两个向量包含相同数量的元素。)

例如,如果vector<int> *i指向3个元素,则应该有4个内存地址。一个用于指针,另一个用于整数变量。

另外,我注意到声明像vector<int*> i这样的向量也是有效的。

这是3个载体。

vector<T> v1;
vector<T*> v2;
vector<T> *v3;

我猜v1是一个向量,它只包含变量(不是指针),其数据类型为T

v2将包含指向类型为T的变量的指针。

v3将是一个单指针,它可以指向一个或多个类型为T的变量。

那么,您认为哪一个访问速度最快,您认为上面有任何误解吗?

如果你愿意提出任何意见/建议,我真的很感激。

1 个答案:

答案 0 :(得分:3)

这里有一个很大的误解:你正在比较具有不同语义的向量。这就像问哪个更快,一杯水或香蕉。

如果您考虑使用指针向量std::vector<T*>,则需要注意您正在使用手动内存管理。在某些用例中它可能更快,但它也更容易出错。如果您的用例合适,您可以考虑使用std::vector<std::shared_ptr<T>>std::vector<std::unique_ptr<T>>

std::vector<T>*完全是另一回事。您需要了解如何,何时以及为何使用普通指针的背景(提示:它们很少使用它们),智能指针或根本没有指针而是直接使用这些对象。

就效率而言,由于移动语义,即使是正常的std::vector<T>现在也可以非常高效。谷歌它,并了解它。此外,效率不仅来自内存分配的数量,还来自内存布局。这是std::vector<T>通常可以提供替代方案的重要好处。

关于效率的一切:衡量它!如果不进行测量,您将永远不会真正知道什么对您的用例更好。从最明显和最正确的代码开始(也就是说:避免手动内存管理),测量它,找出瓶颈,然后通过增加更多复杂性来删除它们。

相关问题