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<int>
结构的大小是恒定的。常见的实现是三个指针,或者在 32 位架构上大约 12 个字节,或者在闪亮的新 64 位架构上是 24 个字节。
所以ref
大约管理 ref.capacity() * 12 字节的连续存储。
ref 中的每个元素/vector<int>
管理自己的整数,独立于 ref
管理的元素。为了简单起见,在ref.size() == ref.capacity()
下面的艺术渲染中。
所以你的
ref.resize(i);
只影响顶行。你的
ref[i].push_back(23);
只影响第 i 列。
【讨论】:
常见的实现大约有 12 个字节。 => 或 64 位架构上的 24 个字节(这很可能是 OP 正在玩弄的东西)。 【参考方案2】:vector<vector <int>> m;
-
内部向量或行被实现为独立的
免费商店中的物品。
每一行中的元素都紧凑存储,能够通过
push_back
和resizing
进行动态分配。
vector< vector<int> >
中的每个内部向量不必具有相同的大小。因此,内部向量(不是它们的元素)不是连续存储的。这意味着,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<T>)
= 12 个字节
而T
是vector<int>
,表示向量的向量。
因此,3×4 vector<vector<int>>
消耗的内存将是。
= 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<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()
指针,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> 类型的数组如何存储在内存中?