【问题标题】:how c++ vector<vector<int>> manages memoryc++ vector<vector<int>>如何管理内存
【发布时间】:2019-10-29 20:42:29
【问题描述】:

vector 容器将对象保存在连续内存中。对于像向量这样的情况很容易理解。但是如果它是一个向量的向量,比如vector>,这个向量中的每个向量都可以有不同的长度。它是如何管理内存的?每次我们推入一个新向量时,它是否分配一个固定长度的向量?如果是这样,如果第一个向量在 push_back 期间变得过大,会发生什么情况。它会触发向量重新分配和复制/移动的完整向量吗?

【问题讨论】:

  • 一个向量包含一个指向内存块的指针。当内存不足时,它会分配一个新的内存块。向量的向量只是指向内存块的指针的“列表”。当列表变得太短时会创建一个新的“列表”
  • FWIW,不要使用向量的向量。如果您需要一个多维结构,请实现一个包装一维向量的类并使用数学来假装它具有多个维度。

标签: c++ vector memory-management


【解决方案1】:

向量是指向动态数组的指针。如果你 push_back 发现你的数组空间不足,你分配一个新的、更大的数组,复制旧数组中的所有内容,然后将新值插入。

如果您有一个向量向量,则对于每个内部向量也是如此。

您需要在这里了解的是,向量的向量(与二维数组不同)在内存中不是连续的。每个内部向量的数组都可以存储在内存中的任何位置。或者换句话说,“向量向量中的每个向量都是完全不同的向量。每个向量都有自己的、完全独立且单独管理的缓冲区。1


1.感谢 user4581301 !

【讨论】:

  • 为了将这个正确答案带回家,vectors 中的vector 中的每个vector 都是完全不同的vector,每个vector 都有自己的、完全独立且单独管理的缓冲区。
  • 向量本身不能增长的是大小。如果它是vector&lt;int&gt;,它的大小是sizeof(vector&lt;int&gt;)。分配的块的大小可以更改,但是该块是向量本身仅包含一个指向的指针,并且该指针的大小不会改变。类型的大小不取决于它的值。
【解决方案2】:

vector 包含一个指向连续内存块的指针。当它用完内存时,它会分配一个新的内存块。向量的vector 只是指向内存块的指针的vector。虽然每个内存块都是一个连续块,但它们之间并不一定是连续的,也就是说,不一定当一个向量结束时,下一个向量开始时​​,几乎总是有间隙。

为什么不一定几乎总是语义?因为它取决于您使用的内存分配器和操作系统内部结构。归根结底,为用户空间程序分配和提供内存块是操作系统的(一项)工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-14
    • 2019-10-15
    • 2021-07-30
    • 2010-10-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多