矢量矢量如何在内存中对齐?

时间:2016-11-09 03:10:27

标签: c++ memory-management vector

我理解为Set size of vector of vectors at run time  描述,可以将向量的向量声明为

vector<vector<int> > ref;

然后通过

调整第一级的大小
ref.resize(i);

并在第二级推送元素:

ref[i].push_back(23);

但是矢量矢量如何在内存中对齐?

对于简单的向量,它是一个容器并连续对齐其元素,如array;但是在矢量矢量的情况下,我看不到图片。

由于每个内部向量的大小(向量向量中的向量)大小可能会发生变化,因此向量的外向量(向量 in vector的 vector )连续对齐内部向量?外向量是否为每个内向量研究了记忆空间?如果一个向量超调会怎么样?

3 个答案:

答案 0 :(得分:20)

vector<int>中存储的ref结构的大小是不变的。通用实现将此作为三个指针,或32位体系结构上的大约12个字节,或闪亮的新64位体系结构上的24个字节。

所以ref大致管理ref.capacity()* 12个字节的连续存储。

ref中的每个元素/ vector<int>管理自己的整数,而不依赖于ref元素管理的元素。为了简单起见,在ref.size() == ref.capacity()下面的艺术渲染中。

Pretty picture

所以你的

ref.resize(i);

仅影响顶行。你的

ref[i].push_back(23);

仅影响第i列。

答案 1 :(得分:2)

vector<vector <int>> m;
  1. 内部向量或行实现为独立的 免费商店上的物品。
  2. 每行中的元素紧凑存储,能够通过push_backresizing执行动态分配。
  3. vector< vector<int> >中的每个内部向量不必具有相同的大小。因此,内部向量(不是它们的元素)不是连续存储的。这意味着,m[i]第一个元素未存储在{{1}的 last 元素旁边的地址 中}。
  4.   

    矢量的外部矢量(矢量矢量中的矢量)是否连续对齐内部矢量?

    没有。见第2点

      

    外部向量是否为每个内部向量研究了记忆空间?

    没有。见第1点。你需要m[i-1]resize进入内部向量。

      

    矢量向量如何在内存中对齐?

    push_back

    消耗这么多内存

    vector<T> vec;
    

    其中,

    sizeof(vector<T>) + (vec.size() ∗ sizeof(T)) = 12个字节

    对于向量的向量,

    sizeof(vector<T>)T

    因此,3乘4 vector<int>所消耗的内存将是。

    vector<vector<int>>
      

    如果一个向量超调会怎么样?

    vector.resize function corrupting memory when size is too large

答案 2 :(得分:1)

vector<vector<int>>在内存中看起来像这样:

+-+-+-+
|b|e|c|  vector<vector<int>
+-+-+-+ 
 | | |
 | | +-------------------+
 | |                     |
 | +---------------+     |
 |                 |     |
 V                 V     V
+-+-+-+-+-+-+-+-+-+
|b|e|c|b|e|c|b|e|c|  3x vector<int>
+-+-+-+-+-+-+-+-+-+ 
 | | | | | | | | |
 | | | | | | | | +-------------+
 | | | | | | | |               |
 | | | | | | | +-------+       |
 | | | | | | |         |       |
 | | | | | | V         V       V
 | | | | | |+-+-+-+-+-+      
 | | | | | ||i|i|i|i|i|   5x int   
 | | | | | |+-+-+-+-+-+      
 | | | | | |       
 | | | | +-+---+ 
 | | | |       | 
 | | | V       V 
 | | |+-+-+-+-+  
 | | ||i|i|i|i|  4x int
 | | |+-+-+-+-+
 | | |
 | +-+-----------+
 |               |
 V               V
+-+-+-+-+-+-+-+-+
|i|i|i|i|i|i|i|i|  8x int
+-+-+-+-+-+-+-+-+

此处b表示begin() poiner,e表示end()指针,c表示capacity()指针。

您可以看到在内存中不连续,就像您对矩阵结构所期望的那样。每个向量(内部和外部向量)都会处理它自己的内存分配。外部向量不关心它的元素在做什么。