关于多重vector所占空间问题

wen_0817 2016-05-13 04:37:08
请问以下代码:
vector<vector<vector<int> > > a;
a.resize(100);
for(int i=0;i<100;i++)
{
a[i].resize(100);
for(int j=0;j<100;j++)
{
a[i][j].resize(100);
for(int k=0;k<100;k++)
{
a[i][j][k]=k;
}
}
}
1、三重vector a所占空间是多大? sizeof(int)*a.capacity()*a[0].capacity()*a[0][0].capacity()+sizeof(vector<int>)*a.capacity()*a[0].capacity()+sizeof(vector<vector<int> >)*a.capacity()+sizeof(vector<vector<vector<int> > >)这样求对吗?
2、如果1中的算法是对的,为什么最终的结果都会少于任务管理器计算出的结果,而且维数越大结果相差越大?
...全文
235 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
纹枰老妖 2016-05-14
  • 打赏
  • 举报
回复
楼主,建议您看看我的博客,里面有一篇关于vector的博文。至于嵌套vector,在栈上并不占据多余的空间
lm_whales 2016-05-14
  • 打赏
  • 举报
回复
vector<vector<vector<int> > > v; v.resize(N); for(auto &x:v){ x.resize(M); for(auto& y:x)y.resize(K); } 占有空间跟 N,M,K相关,但是不能用 N,M,K 的乘积和他们的和的组合表示出来。 最内层 数据 占有的空间:sizeof(T)*v[i][j].capacity() 对象占用的空间 : sizeof(v[i][j]; 向外: 数据空间: sizeof(vector<T>)*v[i].capacity() 对象空间:sizeof(v[i]; 最外层 :数据空间: sizeof(vector<vector<T> >)*v.capacity() 对象空间:sizeof(v); 一共至少 sizeof(v) +sizeof(vector<vector<T> >)*v.capacity() + sizeof(vector<T>)*v[i].capacity() +sizeof(T)*v[i][j].capacity() 这是必须占用的空间 另外动态分配的空间,未必是恰好等于申请的空间,会有额外的一点空间 假设 用 C 表示,0,1,2 表示层号 一共 占用: sizeof(v) + sizeof(vector<vector<T> >)*v.capacity() + sizeof(vector<T>)*v[i].capacity() +sizeof(T)*v[i][j].capacity() C0+ΣC1[i]+ ΣC2[i][j]; 其中 sizeof(v) 在 对象v 定义的空间内 其余定义在 堆空间 如果 v 是动态分配的,那么v 也会有一个冗余空间占用问题。
paschen 版主 2016-05-14
  • 打赏
  • 举报
回复
引用 3 楼 wen_0817 的回复:
[quote=引用 1 楼 paschen 的回复:] vector类中的成员是存在栈上,而存储的元素是在堆上分配的
谢谢,不过我还不是太明白,能具体说说多重vector内存还如何计算吗?[/quote] vector在栈上的空间占用不多,可以忽略,主要是他在堆上分配的,而堆上分配的涉及STL的实现,STL中一般是有自己的内存管理(内存池),申请内存时并不时直接从操作系统获得,而是从内存池中获得,这样可以避免内存碎片,所以你并不能从任务管理器里看出精确占用的内存
wen_0817 2016-05-13
  • 打赏
  • 举报
回复
引用 4 楼 lqbk1 的回复:

class myIntVectoer
{
int size;
int *p_stuff;

/*-----------
other stuff
-----------*/
}
楼主可以将vector想象成跟上面类似的class 看能不能理解1楼的意思?
你的意思是每一个vector<int> 都有和整个vector有关的变量(例如上面的int size,int *p_stuff),然后还有若干个int型的元素。前者存在栈上,后者在堆上分配空间,对吗? 可是这样的话整个vector占用的内存怎么求?vector<int> a; a的内存=sizeof(vector<int>)+sizeof(int)*a.size(),这样对吗?
lqbk1 2016-05-13
  • 打赏
  • 举报
回复

class myIntVectoer
{
int size;
int *p_stuff;

/*-----------
other stuff
-----------*/
}
楼主可以将vector想象成跟上面类似的class 看能不能理解1楼的意思?
wen_0817 2016-05-13
  • 打赏
  • 举报
回复
引用 1 楼 paschen 的回复:
vector类中的成员是存在栈上,而存储的元素是在堆上分配的
谢谢,不过我还不是太明白,能具体说说多重vector内存还如何计算吗?
wen_0817 2016-05-13
  • 打赏
  • 举报
回复
谢谢,不过我还不是太明白,能具体说说多重vector内存还如何计算吗?
paschen 版主 2016-05-13
  • 打赏
  • 举报
回复
vector类中的成员是存在栈上,而存储的元素是在堆上分配的

64,682

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧