矢量容器将对象保存在连续内存中。对于矢量这样的情况,很容易理解。但是,如果它是向量的向量,例如向量>,该向量的向量中的每个向量可以具有不同的长度。它如何管理内存?每次我们插入新向量时,它是否分配固定长度的向量?如果是这样,如果在push_back期间第一个向量超出大小,将会发生什么。会触发矢量重新分配和复制/移动的完整矢量吗?
答案 0 :(得分:5)
向量是指向动态数组的指针。如果push_back发现数组中的空间不足,请分配一个更大的新数组,从旧数组中复制所有内容,然后将新值保留在其中。
如果您有向量的向量,则对每个内部向量也是如此。
您在这里需要了解的是向量的向量(不同于2D数组),在内存中不是连续的。每个内部向量的数组都可以存储在内存中的任何位置。换句话说,“ 向量向量中的每个向量都是完全不同的向量。每个向量都有自己的,完全独立且独立管理的缓冲区。 1 ”
1。感谢user4581301!
答案 1 :(得分:1)
vector
包含一个指向连续存储块的指针。当内存不足时,它将分配一个新的内存块。向量的vector
只是指向存储块的指针的vector
。尽管每个内存块都是一个连续块,但是它们不一定彼此相邻,也就是说,不一定要在一个向量结束时,下一个开始,所以几乎总是有一个间隙。
为什么不一定和几乎总是语义?因为它取决于您使用的内存分配器和操作系统内部。最终,分配内存块并将其提供给用户空间程序是操作系统的一项或多项工作。