c++ - 在 vector::push_back 内存明智的情况下会发生什么?

标签 c++ vector push-back

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

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

最佳答案

如果已经分配了足够的空间,则对象是从就地参数构造的拷贝。当没有足够的内存时, vector 将按照某种几何级数增长它的内部数据缓冲区(每次新大小将是 k*old_sizek > 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/

相关文章:

C++:如何从数组生成随机数

c++ - 密集和稀疏矩阵的高效(时间和空间复杂度)数据结构

arrays - std::arrays 的 std::vector 的比较函数

c++ - 开始前缺少模板参数

c++ - std::vector::push_back() 不能在 MSVC 上为具有已删除移动构造函数的对象编译

c++ - 具有多个声明符的声明 - 定义?

C++ 类模板特化

C++ push_back 编译器错误“

c++ - 当在 Objective-C++ 中应用于 __weak 指针时,通过 "auto"关键字推导类型的规则是什么?

c++ - 使用 vector push_back 的内存分配