当调整std :: vector的大小时(通过reserve()或resize()),默认分配器会做什么?
std::vector
内部使用的内存块实际上已调整大小。
分配一个新的内存块,将数据从旧的内存块移动(例如std::move
d)到新的内存块,最后释放旧的内存块。
答案 0 :(得分:5)
C ++分配器不支持C realloc
之类的东西。每当vector
需要更多内存时,它必须分配新存储,从旧移动到新存储,并释放旧存储。
无论哪种方式,realloc
都不适合vector
。对于典型的分配器,realloc
只会在缩小其大小时保存繁重的复制操作,或者在某些情况下仅增加几个字节。 vector
永远不会缩小,只会以非常大的步长增长。
请注意,移动支持是C ++ 2011中的一种新行为。以前的版本将复制。
答案 1 :(得分:2)
当向量需要增长时,在包括调整大小/保留的任何操作中,还有push_back,插入...获取新的内存块,并且复制旧动态数组中的元素或移动< / em>到新位置(如果类型支持移动)。完成此操作后,旧元素将被销毁,旧内存将被释放。
请注意, move 在标准中具有与直观含义不同的特定含义:对象(而不是对象)的内容的管理是从原始对象是新的。
答案 2 :(得分:0)
除了解释语义的其他答案之外,reserve
和resize
之间需要考虑的一个重要区别是reserve
只是在resize
{}}}的情况下分配内存而不进行初始化分配内存并默认初始化它。