【问题标题】:How is a Vector of Vector aligned in memory?Vector的Vector如何在内存中对齐?
【发布时间】:2016-11-09 03:10:27
【问题描述】:

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

vector<vector<int> > ref;

然后调整第一级的大小

ref.resize(i);

并在第二层推送元素:

ref[i].push_back(23);

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

对于简单的向量,它是一个容器,它的元素不断对齐,就像array;但是在vector of vector的情况下,我看不到图片。

由于每个内部向量(vector的向量中的vector)的大小可能会发生变化,因此向量的外部向量(vector em> in vector of vector) 连续对齐内部向量?外部向量是否为每个内部向量保留内存空间?如果一个向量过冲怎么办?

【问题讨论】:

    标签: c++ memory-management vector


    【解决方案1】:

    存储在ref 中的vector&lt;int&gt; 结构的大小是恒定的。常见的实现是三个指针,或者在 32 位架构上大约 12 个字节,或者在闪亮的新 64 位架构上是 24 个字节。

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

    ref 中的每个元素/vector&lt;int&gt; 管理自己的整数,独立于 ref 管理的元素。为了简单起见,在ref.size() == ref.capacity()下面的艺术渲染中。

    所以你的

    ref.resize(i);
    

    只影响顶行。你的

    ref[i].push_back(23);
    

    只影响第 i 列。

    【讨论】:

    • 常见的实现大约有 12 个字节。 => 或 64 位架构上的 24 个字节(这很可能是 OP 正在玩弄的东西)。
    【解决方案2】:
    vector<vector <int>> m;
    
    1. 内部向量或行被实现为独立的 免费商店中的物品。
    2. 每一行中的元素都紧凑存储,能够通过push_backresizing进行动态分配。
    3. vector&lt; vector&lt;int&gt; &gt; 中的每个内部向量不必具有相同的大小。因此,内部向量(不是它们的元素)不是连续存储的。这意味着,m[i]first 元素不会存储在地址 immediately 中,紧邻 m[i-1]last 元素。李>

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

    没有。见点#2

    外部向量是否为每个内部向量保留内存空间?

    没有。见点#1。您需要将resize 或将push_back 放入内部向量。

    向量的向量在内存中是如何对齐的?

    vector<T> vec;
    

    消耗这么多内存

    sizeof(vector<T>) + (vec.size() ∗ sizeof(T))
    

    在哪里,

    sizeof(vector&lt;T&gt;) = 12 个字节

    Tvector&lt;int&gt;,表示向量的向量

    因此,3×4 vector&lt;vector&lt;int&gt;&gt; 消耗的内存将是。

     = sizeof(vector<vector<int>>) + (vec.size() * sizeof(vector<int>))
     = 12 + 3 * 12 
     = 48 
    

    如果一个向量过冲怎么办?

    vector.resize function corrupting memory when size is too large

    【讨论】:

      【解决方案3】:

      vector&lt;vector&lt;int&gt;&gt; 在内存中可能如下所示:

      +-+-+-+
      |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()指针,e表示end()指针,c表示capacity()指针。

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

      【讨论】:

        猜你喜欢
        • 2012-10-08
        • 1970-01-01
        • 2020-05-26
        • 1970-01-01
        • 2016-04-17
        • 2016-01-12
        • 1970-01-01
        • 2018-05-02
        相关资源
        最近更新 更多