11

我写了一小段代码来确定如何在向量中分配内存。

#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 进行了编译,得到了以下结果:

视觉工作室:

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;

如您所见,这是两个截然不同的结果。为什么会这样?它仅取决于编译器还是沉迷于其他因素?

即使对于大量元素,继续将容量翻倍真的有意义吗?

4

3 回答 3

8

增长的方式vector是由实现定义的。因此可以使用不同的策略,从而在插入相同数量的元素后产生不同的容量

如果您需要依赖分配了多少项目,您应该使用reserve和/或resize方法vector

于 2012-07-19T12:28:56.573 回答
4

正如你所看到的,VS 用更小的块添加额外的空间,而 G++ 我是通过 2 的幂来实现的。这只是相同基本思想的实现:你添加的元素越多,下次分配的空间就越多(因为您更有可能添加其他数据)。

想象一下,您向向量添加了 1 个元素,而我添加了 1000。很有可能会再添加 1000,而您不太可能会添加。这就是这种空间分配策略的原因。

确切的数字肯定取决于某些东西,但这是编译器制造商的推理,因为他们可以以任何他们想要的方式实现它。

于 2012-07-19T12:31:29.190 回答
3

该标准仅定义向量的行为。内部真正发生的事情取决于实现。将容量加倍会导致推/弹出 n 个元素的摊销 O(n) 成本,我猜这是向量所必需的。在这里查看更多详细信息。

于 2012-07-19T12:34:26.103 回答