Vector的Vector如何在内存中对齐?

Posted

技术标签:

【中文标题】Vector的Vector如何在内存中对齐?【英文标题】:How is a Vector of Vector aligned in memory? 【发布时间】: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) 连续对齐内部向量?外部向量是否为每个内部向量保留内存空间?如果一个向量过冲怎么办?

【问题讨论】:

【参考方案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;
    内部向量或行被实现为独立的 免费商店中的物品。 每一行中的元素都紧凑存储,能够通过push_backresizing进行动态分配。 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()指针。

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

【讨论】:

以上是关于Vector的Vector如何在内存中对齐?的主要内容,如果未能解决你的问题,请参考以下文章

vectorの奇技淫巧C++ vector 如何正确处理动态申请内存的元素

❌❌vectorの奇技淫巧⭕⭕C++ vector 如何正确处理动态申请内存的元素

如何delete 指针vector中new出来的内存(之前说的方法不管用TAT)?

std::vector<std::array<T, N>> 或 std::array<std::vector<T>,N> 类型的数组如何存储在内存中?

对类使用 C 内在函数和内存对齐困难

C++ 中 vector 如何实现内存分配