在矢量:: push_back内存明智的情况下会发生什么?

dte*_*ech 13 c++ vector push-back

我的问题是关于它的效果vector::push_back,我知道它在向量的末尾添加了一个元素但是在引擎盖下面会发生什么?

IIRC内存对象是按顺序方式分配的,所以我的问题是是否vector::push_back只是在向量之后立即分配更多内存,如果是这样,如果该位置没有足够的可用内存会发生什么?或者也许在"结束"中添加指针以使向量"跳"到它继续的位置?或者只是通过将其复制到另一个有足够空间且旧副本被丢弃的位置来重新分配?或者别的什么?

Dav*_*eas 20

如果已经分配了足够的空间,则该对象是根据参数进行复制构造的.当没有足够的内存,所述载体将增长它的内部的DataBuffer以下某种几何级数(每次新的大小将是k*old_sizek > 1[1] )和存在于原始缓冲器中的所有对象将被移动到新的缓冲器.操作完成后,旧缓冲区将被释放到系统.

在上一句中,移动不用于技术移动构造函数/移动分配意义上,它们可以被移动复制或任何等效操作.

[1]通过因子增长k > 1可确保摊销成本push_back不变.实际常量因实现而异(Dinkumware使用1.5,gcc使用2).摊销成本意味着即使每隔一段时间push_back花费很高(O(N)根据当时矢量的大小),这些情况也很少发生,因此整个插入过程中所有操作的成本都是线性的.插入,因此每次插入平均成本不变)

  • @ddriver:这是[Deque](http://www.sgi.com/tech/stl/Deque.html)通常是实现的(用数据块之间的指针). (5认同)
  • @Vlad:那会使引用无效.您可以参考,但您必须处理容器的失效规则. (4认同)
  • 该对象未构建到位.它被复制到位,编译器可以省略复制操作.这是非常不同的.vector :: C++ 11构造的emplace到位. (2认同)