当调整std :: vector(通过reserve()或resize())时,默认分配器会做什么?

时间:2012-01-21 18:11:51

标签: c++ stl

当调整std :: vector的大小时(通过reserve()或resize()),默认分配器会做什么?

  • std::vector内部使用的内存块实际上已调整大小。

  • 分配一个新的内存块,将数据从旧的内存块移动(例如std::move d)到新的内存块,最后释放旧的内存块。

    < / LI>

3 个答案:

答案 0 :(得分:5)

C ++分配器不支持C realloc之类的东西。每当vector需要更多内存时,它必须分配新存储,从旧移动到新存储,并释放旧存储。

无论哪种方式,realloc都不适合vector。对于典型的分配器,realloc只会在缩小其大小时保存繁重的复制操作,或者在某些情况下仅增加几个字节。 vector永远不会缩小,只会以非常大的步长增长。

请注意,移动支持是C ++ 2011中的一种新行为。以前的版本将复制。

答案 1 :(得分:2)

当向量需要增长时,在包括调整大小/保留的任何操作中,还有push_back,插入...获取新的内存块,并且复制旧动态数组中的元素或移动< / em>到新位置(如果类型支持移动)。完成此操作后,旧元素将被销毁,旧内存将被释放。

请注意, move 在标准中具有与直观含义不同的特定含义:对象(而不是对象)的内容的管理是从原始对象是新的。

答案 2 :(得分:0)

除了解释语义的其他答案之外,reserveresize之间需要考虑的一个重要区别是reserve只是在resize {}}}的情况下分配内存而不进行初始化分配内存并默认初始化它。