2016-11-09 41 views
10

我明白作为Set size of vector of vectors at run time 描述,一个可以声明矢量的矢量作为矢量矢量如何在内存中对齐?

vector<vector<int> > ref; 

然后通过

ref.resize(i); 

调整第一级和第二级推元件:

ref[i].push_back(23); 

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

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

由于每个内向量(矢量矢量的矢量)的大小可能会改变的大小,确实矢量(该矢量矢量矢量的)对准内矢量汽车无外矢量?外部矢量是否为每个内部矢量研究了Memeory空间?如果一个向量超调会怎么样?

回答

19

存储在ref中的vector<int>结构的大小是恒定的。常见的实现方式有三个指针,即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列。

+16

好的油漆:) –

+0

*普通的实施方案中有这样在大约12个字节。* =>或在64位体系结构24个字节(这是更可能是什么OP与玩弄)。 –

2
vector<vector <int>> m; 
  1. 内载体或行被实现为在自由存储区独立 对象。
  2. 每行中元素均为紧凑存储,能够通过push_backresizing执行动态分配。
  3. vector< vector<int> >中的每个内部向量没有必要具有相同的大小。所以,内部向量(不是它们的元素)不是连续存储的。这意味着,中m[i]第一元素没有被存储在地址立即旁边m[i-1]最后元素。

不矢量(矢量的矢量的矢量)的外矢量汽车无对准内矢量?

号见点#2

是否针对每个内部向量外矢量researve memeory空间?

号看点#1。你需要resize或做push_back进入内部向量。

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

vector<T> vec; 

消耗这多少内存

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

其中,

sizeof(vector<T>) = 12字节

Tvector<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

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()指针。

你看,那不在内存中连续,你会从一个矩阵结构的期望。每个矢量(内部和外部矢量)都会处理它自己的内存分配。外部矢量不关心它的元素在做什么。