【发布时间】:2012-07-18 15:23:38
【问题描述】:
我写了一小段代码来确定向量中的内存分配是如何完成的。
#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;
g++:
1 2 4 8 16 32 64 128 256 512 1024 2048 4096 8192 16384 32768 65536 131072
capacity = capacity * 2;
如您所见,这是两个截然不同的结果。 为什么会这样?是只依赖编译器还是依赖其他因素?
即使对于大量元素,继续将容量翻倍真的有意义吗?
【问题讨论】:
-
只要符合标准对矢量的要求和效率,就可以随意增加。
-
我认为容量扩展取决于编译器的实现。我怀疑标准对此有任何说明。
-
拉伸向量大小,如容量 = 容量 * 1.5;从数学上讲,使用 MSVS 编译器会产生奇怪的结果。 1→2:1 * 1.5 = 1.5,四舍五入为 2 - 很好 3→4:3 * 1,5 = 4.5,但新分配是 4,而不是 5,根据数学中四舍五入 0.5 秒的假设.有人知道,这里发生了什么吗?
-
他们必须使用半偶数舍入模式en.wikipedia.org/wiki/Rounding#Round_half_to_even
标签: c++ memory-management vector