vector动态二维数组(容器的容器)占用内存分析

原文地址:http://blog.csdn.net/kangroger/article/details/38386099


之前在这里写过一篇“C++中的动态二维数组”。在C++中没有动态二维(多维)数组。但是根据原理我们可以自己创建。

在看过STL的vector源代码后"《STL源码剖析》---stl_vector.h阅读笔记"后,想到可以用容器的容器来做二维数组。

创建一个2x4的二维数组。想到的办法是:先创建一个容器的容器,外层大小的2(2行),然后里面容器小大为4(4列)。

  1. int row=2,col=4;  
  2.     vector<vector<int> > v(row);//v为容器的容器,大小为2.  
  3.     for(int i=0; i<row; i++)  
  4.         v[i].resize(col);//里层容器大小设置为4  

那么v是怎么使用内存的呢?

我知道vector开辟的是连续内存,但是vector内部的元素也是vector,内部的vector大小不知道且可变,并且内部的vector们大小也可能不一样。但是vector要求元素所占用空间是相同的,因此内部的vector中存储的元素一定不占用外部vector v的空间。

在分析了vector源代码后,可以知道vector只有三个成员变量:

  1. iterator start;    
  2. iterator finish;    
  3. iterator end_of_storage;    
这三个都是原生态指针,在32位机上占用12字节。因此每个内部元素vector只占用12个字节,内部元素vector存储的元素在其他地方开辟内存。写代码验证一下:

  1. vector<vector<int> >::iterator iter1=v.begin();  
  2. vector<vector<int> >::iterator iter2=iter1+1;  
  3. cout<<"两个迭代器之间的距离(差值)"<<(int)iter2-(int)iter1<<endl;  
  4. cout<<"vector占用内存大小:"<<sizeof(vector<int>)<<endl;  
输出为:

两个迭代器之间的距离(差值)12
vector占用内存大小:12

验证了上面的说法。内部元素vector在其他地方开辟内存是连续的,也就是说每一行的元素占用内存是连续的。再写代码验证一下:

  1. for(int i=0; i<row; i++)//初始化元素的值  
  2.     for(int j=0; j<col; j++)  
  3.         v[i][j]=i*col+j+1;  
  4. for(int i=0; i<row; i++)//输出其地址和值  
  5. {  
  6.      for(int j=0; j<col; j++)  
  7.         cout<<&v[i][j]<<":"<<v[i][j]<<" ";  
  8.      cout<<endl;  
  9. }  
输出为:

0x0012bb60:1 0x0012bb64:2 0x0012bb68:3 0x0012bb6c:4 
0x0012bc90:5 0x0012bc94:6 0x0012bc98:7 0x0012bc9c:8 

可见行的内存是连续的。

因此得出结论:

vector<vector<int> > v构建的动态二维数组,内部vector只占用12字节(32位机器)。从其源代码可以看到,其实所有vector只需3个成员变量。vector中的元素存储在动态开辟的内存上。

下面贴上测试代码,用的vector是SGI版本的STL,用其他版本的vector占用内存可能不一样,我用vs2010自带的试了一下,占用20个字节。

  1. #include<iostream>  
  2. #include<fstream>  
  3. #include"vector"  
  4. using namespace std;  
  5. int main()  
  6. {  
  7.     ofstream fout("result.txt");  
  8.     int row=2,col=4;  
  9.     vector<vector<int> > v(row);//v为容器的容器,大小为2.  
  10.     for(int i=0; i<row; i++)  
  11.         v[i].resize(col);//里层容器大小设置为4  
  12.       
  13.   
  14.     vector<vector<int> >::iterator iter1=v.begin();  
  15.     vector<vector<int> >::iterator iter2=iter1+1;  
  16.     fout<<"两个迭代器之间的距离(差值)"<<(int)iter2-(int)iter1<<endl;  
  17.     fout<<"vector占用内存大小:"<<sizeof(vector<int>)<<endl;  
  18.   
  19.     for(int i=0; i<row; i++)//初始化元素的值  
  20.         for(int j=0; j<col; j++)  
  21.             v[i][j]=i*col+j+1;  
  22.     for(int i=0; i<row; i++)//输出其地址和值  
  23.     {  
  24.         for(int j=0; j<col; j++)  
  25.             fout<<&v[i][j]<<":"<<v[i][j]<<" ";  
  26.         fout<<endl;  
  27.     }  
  28.     return 0;  
  29. }  

上面的fout只是把结果输出到文件result.txt中了,便于复制。
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值