在固定长度相同时,
std::vector<>
和new[]
在分配、释放和访问时间方面是否有很大的差异?std::vector<>
和new[]
在分配、释放和访问时间方面是否有很大的差异?这取决于类型和调用方式。 std::vector<int> v(1000000);
必须将一百万个整数清零,而 new int[1000000];
不需要,因此我预计速度会有所差异。如果由于某些原因您不关心元素的初始值,那么这就是 std::vector
中可能会让您付出昂贵代价却得不到任何回报的地方之一。
如果将 std::vector<int> v(1000000);
与 new int [1000000]();
进行比较,我怀疑你看不到太大的区别。重要的问题是它们中是否有一个具有更优化的循环来设置零,而另一个没有。如果是这样的话,那么另一个的实现已经错失了机会(或者更具体地说是优化器的机会)。
v(N)
和 new T[N]
不可比较。您需要将内存和对象分开处理。因此,真正的比较应该是与 std::vector<T> v; v.reserve(N);
进行。如果说有什么区别的话,那么 vector
更好,因为它允许您在对象和内存方面保持清晰的思路。 - Kerrek SBT* t = new T[N]
允许你执行 t[n] = 42;
,而 vector.reserve
的对应方法则不行。 - juanchopanzat[n]
假定您已经拥有一系列对象。我的意思是,是的,您可能有一些奇怪的“未初始化存储随机访问”用例在脑海中,但我相信大多数实际的、真实世界的算法要么需要一个明智的、现有的范围,要么以某种方式顺序地构建一个集合。如果你真的需要,你可以构建一个未初始化的随机访问接口。 - Kerrek SBnew[]
分配大内存块的速度更快,而std::vector<>
则更方便。当两者等效时,这些方法必须有交集。问题是:这个交集点是否线性地取决于机器性能?如果不是,这是否意味着某种方法更优越? - Ivarsnew[]
分配大块内存更快。new[]
对于平凡类型有一个选项,可以将它们全部保持未初始化状态,而vector
则没有(你可以像Kerrek所说的那样使用reserve
,但为了使用任何索引,必须先初始化所有较低的索引)。因此,对于某些有限的目的,new[]
可能会更快,但您不应该留下这通常更快的印象。 - Steve Jessopnew
是一件糟糕的事情,因为它违反了单一职责原则,假设了两个职责:内存分配和对象构造。复杂性是理智的敌人,通过分离关注点和隔离职责来对抗复杂性。
标准库容器正好可以做到这一点,并且只需要考虑对象。此外,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);
std::vector
还通过reserve
/capacity
接口使你能够独立地思考存储。 - dyp
std::vector
的operator []
应该是内联的,生成的代码应该相当类似。 - Shahbazstd :: vector <>
并避免使用裸指针。 - Walter