矢量内存分配策略
vector memory allocation strategy
我写了一小段代码来确定如何在向量中分配内存。
#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 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 4096 8192 16384 32768 65536 131072
capacity = capacity * 2;
正如你所看到的,这是两个非常不同的结果。为什么会这样?它是仅仅取决于编译器,还是沉迷于其他因素?
即使对于大量元素,继续将容量翻倍真的有意义吗?
vector
如何增长是实现定义的。因此,在插入相同数量的元素后,可以使用不同的策略来产生不同的容量
如果您需要依赖于分配的项目数量,则应使用vector
的reserve
和/或resize
方法
正如您所看到的,VS正在用较小的块添加额外的空间,而G++i则用2的幂来添加。这只是相同基本思想的实现:添加的元素越多,下次分配的空间就越多(因为添加额外数据的可能性更大)。
假设你在向量上加了一个元素,我加了1000。这更有可能再增加1000,而你不太可能再增加。这就是这种空间分配策略的理由。
确切的数字当然取决于某些东西,但这是编译器制造商的推理,因为他们可以用任何他们想要的方式实现它。
标准只定义向量的行为。内部真正发生的事情取决于实现。将容量加倍会导致推送/弹出n个元素的摊销O(n)成本,我想这是向量所必需的。查看此处了解更多详细信息。
- 将数组的地址分配给变量并删除
- vector.resize()中的分配错误
- 如果C++类在类方法中具有动态分配,但没有构造函数/析构函数或任何非静态成员,那么它仍然是POD类型吗
- Win32编译器选项和内存分配
- 函数中堆分配的效果与缺少堆分配的情况
- 使用动态分配的数组会导致代码分析发出虚假的C6386缓冲区溢出警告
- 多个文件的内存分配错误"在抛出 'std :: bad_alloc' what (): std :: bad_alloc 的实例后终止调用" [C++]
- 获取字符串的长度并将其分配给数组
- 将地址分配给本地指针后,公共对象的变量将消失
- C++17中的并行执行策略
- 递归模板化函数不能分配给具有常量限定类型"const tt &"的变量"state"
- 有没有一种方法可以使用placement new将堆叠对象分配给分配的内存
- 我在二维向量中是否正确分配了内存
- 正在尝试重载二进制搜索树分配运算符
- 更改矢量内存分配策略
- STD :: vector和std ::字符串重新分配策略
- 矢量内存分配策略
- 如何使用 C++ 实现分配策略
- 排队对象的分配策略
- std::字符串分配策略