我的问题是关于 vector::push_back
的效果,我知道它在 vector 末尾添加了一个元素,但是在引擎盖下会发生什么?
IIRC 内存对象是按顺序分配的,所以我的问题是 vector::push_back
是否只是在 vector 之后立即分配更多内存,如果是这样,如果没有足够的可用内存会发生什么情况在那个位置?或者也许在“结束”中添加了一个指针以使 vector “跳跃”到它继续的位置?或者它只是通过将其复制到另一个有足够空间的位置而重新分配并且旧拷贝被丢弃?还是别的什么?
最佳答案
如果已经分配了足够的空间,则对象是从就地参数构造的拷贝。当没有足够的内存时, vector 将按照某种几何级数增长它的内部数据缓冲区(每次新大小将是 k*old_size
和 k > 1
< sup>[1]) 并且原始缓冲区中存在的所有对象随后将被移动到新缓冲区。操作完成后,旧缓冲区将释放给系统。
在前面的句子中,move 并不是技术上的move-constructor/move-assignment 意义上的,它们可以是移动或复制或任何等效操作。
[1] 以 k > 1
倍数增长可确保 push_back
的摊销成本不变。实际常量因一种实现而异(Dinkumware 使用 1.5,gcc 使用 2)。摊销成本意味着即使每隔一段时间就有一个 push_back
会非常昂贵(O(N)
在当时的 vector 大小上),但这些情况很少发生足以使整个插入集的所有操作的成本与插入次数成线性关系,因此每个插入平均是一个恒定成本)
关于c++ - 在 vector::push_back 内存明智的情况下会发生什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7899973/