当两者都固定且长度相同时,std::vector<>
和new[]
之间的分配,解除分配和访问时间是否有很大差异?
答案 0 :(得分:10)
取决于类型以及您如何调用它。 std::vector<int> v(1000000);
必须为零一百万,而new int[1000000];
则没有,所以我预计速度会有所不同。这是std::vector
中的一个地方,如果由于某种原因你不关心元素的初始值,你可以通过鼻子支付你不使用的东西。
如果你将std::vector<int> v(1000000);
与new int[1000000]();
进行比较,那么我怀疑你会发现很多不同之处。重要的问题是它们中的一个是否以某种方式具有比另一个更优化的循环设置零。如果是这样,那么另一个的实现已经错过了一个技巧(或者更具体地说是优化器)。
答案 1 :(得分: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);