一个用于std::vector的内存管理的不同乘法器
A different multiplier for the memory management of std::vector
我一直在使用动态数组结构,我注意到c++标准库的vector实现通过在当前容量被填满后每次调用push_back()时将std::vector的容量加倍来增加它的容量。我想在stackoverflow上有人提到微软编译器使用1.5作为乘数。我很好奇,这些值是硬编码的,还是我可以在某个地方设置一个自定义乘数?
该标准不要求提供自定义乘数的方法,当然您可以编写自己的集合或覆盖一个集合,并对它做任何您想做的事情。以下是微软的实现,来自VS 2012:
void _Reserve(size_type _Count)
{ // ensure room for _Count new elements, grow exponentially
size_type _Size = size();
if (max_size() - _Count < _Size)
_Xlen();
else if ((_Size += _Count) <= capacity())
;
else
reserve(_Grow_to(_Size));
}
您可以看到它们总是按size()
增长——从而使容量增加一倍,并且这不是您(作为程序员)打算重写的值。
我很确定这是一个"实现细节,不需要被披露",我希望它也不必是一个常量,它可能是这样的:
std::vector::grow()
{
if (size <= 100)
{
newsize = size * 2;
}
else if (size <= 10000)
{
newsize = size * 3 / 2; /* 1.5x */
}
else
{
newsize = size * 5 / 4; /* 1.2x */
}
.... allocate a "newsize" chunk of memory etc ...
}
据我所知,没有"设置乘数"的接口。每个实现都要选择一个增长率。当数字变得非常大时,2x有点浪费,并且您可能会"耗尽虚拟空间"(例如,在int
向量中使用512M元素超过2GB的限制,这在32位系统中可能无法作为单个分配)。
我可以在某个地方设置自定义乘数吗?
其他答案已经在直接意义上处理了这个问题(以及你的问题的其余部分),所以我就不再重复了。但是,如果您想自己控制vector
的生长,请使用std::vector::reserve
。如果您在准备将一个元素插入到已经满的vector
中时调用此方法,那么您可以获得相同的结果(尽管有一点额外的开销,因为您将需要一个冗余的条件来检查大小)。
相关文章:
- 当vector是tje全局变量时,c++中vector的内存管理
- 当分配一个字符串值并稍后通过分配另一个值进行更改时C++如何管理内存?
- 我有一个线程 1:EXC_BAD_ACCESS(代码 = 1,地址 = 0x8)错误.我认为这是由于内存管理不好.我可以
- 可以通过非原始指针来增强容器矢量管理内存
- 如何使用 std::vector<std::tuple<A,B>> 来管理内存(调整大小、保留,...),但实际上将 As 保留在 B 之前,连续
- 线程管理内存泄漏
- 通过读取文件创建映射<字符串,矢量>时如何管理内存<string>
- 管理内存C++
- ptr_vector如何管理内存
- 在C++Builder/Firemonkey中使用表单创建来管理内存
- 如何正确管理内存(运行时)C++
- 在Node.js中使用Native Abstractions时,如何管理内存
- ostream是如何管理内存的
- C++中管理内存泄漏的问题
- OpenCL:在 CPU 上而不是在 GPU 上更正结果:如何正确管理内存
- deque是如何管理内存的
- 用c++/cli互操作管理内存
- 如何衡量管理内存所花费的时间
- (加速C++)章节管理内存
- 如何在此场景中管理内存