C++中的std::vector<>与new[]性能比较

3
在固定长度相同时,std::vector<>new[]在分配、释放和访问时间方面是否有很大的差异?

4
不应该有问题。std::vectoroperator [] 应该是内联的,生成的代码应该相当类似。 - Shahbaz
1
对其进行性能分析并查看,但我预计不会有任何差别。 - Angew is no longer proud of SO
除非这真的是性能关键点(我怀疑;而且访问不会是),请使用 std :: vector <> 并避免使用裸指针。 - Walter
即使它存在,但是它的影响微乎其微。向量维护元素的数组列表。而新的分配内存位置。后端的向量也使用new关键字创建元素。因此,new的工作仅是分配内存,而向量不仅将创建一个新元素,还将将其组织到数组中并增加大小信息,可能还有其他事情。因此,我认为在向量重新组织元素(添加或删除元素时)时需要更多时间。 - Kamran Khan
2个回答

10

这取决于类型和调用方式。 std::vector<int> v(1000000); 必须将一百万个整数清零,而 new int[1000000]; 不需要,因此我预计速度会有所差异。如果由于某些原因您不关心元素的初始值,那么这就是 std::vector 中可能会让您付出昂贵代价却得不到任何回报的地方之一。

如果将 std::vector<int> v(1000000);new int [1000000](); 进行比较,我怀疑你看不到太大的区别。重要的问题是它们中是否有一个具有更优化的循环来设置零,而另一个没有。如果是这样的话,那么另一个的实现已经错失了机会(或者更具体地说是优化器的机会)。


4
但是 v(N)new T[N] 不可比较。您需要将内存和对象分开处理。因此,真正的比较应该是与 std::vector<T> v; v.reserve(N); 进行。如果说有什么区别的话,那么 vector 更好,因为它允许您在对象和内存方面保持清晰的思路。 - Kerrek SB
@KerrekSB 我同意你的观点,但也可以从另一个角度来看待这个问题:T* t = new T[N] 允许你执行 t[n] = 42;,而 vector.reserve 的对应方法则不行。 - juanchopanza
@juanchopanza:不,但t[n]假定您已经拥有一系列对象。我的意思是,是的,您可能有一些奇怪的“未初始化存储随机访问”用例在脑海中,但我相信大多数实际的、真实世界的算法要么需要一个明智的、现有的范围,要么以某种方式顺序地构建一个集合。如果你真的需要,你可以构建一个未初始化的随机访问接口。 - Kerrek SB
1
@SteveJessop,我意识到new[]分配大内存块的速度更快,而std::vector<>则更方便。当两者等效时,这些方法必须有交集。问题是:这个交集点是否线性地取决于机器性能?如果不是,这是否意味着某种方法更优越? - Ivars
并不是new[]分配大块内存更快。new[]对于平凡类型有一个选项,可以将它们全部保持未初始化状态,而vector则没有(你可以像Kerrek所说的那样使用reserve,但为了使用任何索引,必须先初始化所有较低的索引)。因此,对于某些有限的目的,new[]可能会更快,但您不应该留下这通常更快的印象。 - Steve Jessop

3

new是一件糟糕的事情,因为它违反了单一职责原则,假设了两个职责:内存分配和对象构造。复杂性是理智的敌人,通过分离关注点和隔离职责来对抗复杂性。

标准库容器正好可以做到这一点,并且只需要考虑对象。此外,std::vector还可以通过reserve/capacity接口,独立地考虑存储。

因此,为了保持程序逻辑清晰,您应始终优先选择像std::vector这样的容器:

std::vector<Foo> v;

// make some storage available
v.reserve(100);

// work with objects - no allocation is required
v.push_back(x);
v.push_back(f(1, 2));
v.emplace_back(true, 'a', 10);

在这里,你用“对象”一词的哪个意义?(我有点困惑..) - dyp
@DyP:我猜你是指Python 3.8的意思? - Kerrek SB
标准库容器可以让你做到这一点,而且只需要考虑“存储区域”。此外,std::vector还通过reserve/capacity接口使你能够独立地思考存储。 - dyp
哦,等等,是3.8,不是1.8。 - dyp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接