我写了一小段代码来确定如何在向量中分配内存。
#include <iostream>
#include <vector>
using namespace std;
int main ()
{
vector<unsigned int> myvector;
unsigned int capacity = myvector.capacity();
for(unsigned int i = 0; i < 100000; ++i) {
myvector.push_back(i);
if(capacity != myvector.capacity())
{
capacity = myvector.capacity();
cout << myvector.capacity() << endl;
}
}
return 0;
}
我在Ubuntu上使用Visual Studio 2008和g ++ 4.5.2编译了这个并得到了这些结果:
Visual Studio:
1 2 3 4 6 9 13 19 28 42 63 94 141 211 316 474 711 1066 1599 2398 3597 5395 8092 12138 18207 27310 40965 61447 92170 138255
capacity = capacity * 1.5;
克++:
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072
capacity = capacity * 2;
如您所见,这是两个非常不同的结果。 为什么会这样?是仅依赖于编译器还是沉迷于其他因素?
即使对于大量元素,继续将容量增加一倍是否真的有意义?
答案 0 :(得分:8)
vector
如何增长是实施定义的。因此可以使用不同的策略,在插入相同数量的元素之后产生不同的容量
如果您需要依赖分配的项目数量,则应使用reserve
的{{1}}和/或resize
方法
答案 1 :(得分:3)
正如你所看到的,VS正在用更小的块添加额外的空间,而G ++我用2的幂来做。这只是相同基本思想的实现:你添加的元素越多,分配的空间就越多下次(因为您更有可能添加其他数据)。
想象一下,你已经向向量中添加了1个元素,并且我已经添加了1000个。它更有可能会添加另外1000个元素而且你不太可能。这就是这种分配空间战略的原因。
确切的数字肯定取决于某些东西,但这是编译器制造商的推理,因为他们可以以他们想要的任何方式实现它。
答案 2 :(得分:2)
标准仅定义了向量的行为。内部真正发生的事情取决于实施。 考虑到容量加倍会导致推动/弹出n个元素的摊销成本,这是向量所需的,我猜。 查看here了解更多详情。