免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 5132 | 回复: 4
打印 上一主题 下一主题

stl容器的内存占用 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-16 17:51 |只看该作者 |倒序浏览
本帖最后由 gta 于 2010-09-18 12:03 编辑
  1. #include <iostream>
  2. #include <map>
  3. #include <vector>
  4. using namespace std;
  5. class test
  6. {
  7.   char s[1024];
  8.   public:
  9.           test()
  10.           {cout<<"test() "<<this<<endl;
  11.           }
  12.           test(const test&)
  13.           {cout<<"test(const test&) "<<this<<endl;}
  14.           ~test()
  15.           {cout<<"~test() "<<this<<endl;
  16.           }
  17. };


  18. typedef std::map<int,test> testMap;
  19.        
  20. void f()
  21.   {

  22.   testMap m_testMap;
  23.   unsigned i=~0UL;
  24.   
  25.   while(i--);//用来拖时间,在这段时间内用top命令可以看到本程序的内存占用为0.4%

  26.         //往map里灌20000个大对象
  27.   for(int i = 0; i < 20000; i++)
  28.   {
  29.   
  30.             m_testMap[i];
  31.   }
  32.   
  33.   while(i--);//用来拖时间,在这段时间内用top命令可以看到本程序的内存占用升到8.4%
  34.    
  35.   for(int i =19999; i >=0 ; i--)
  36.   {

  37.       m_testMap.erase(i);

  38.   }
  39.   while(i--);//用来拖时间,在这段时间内用top命令可以看到本程序的内存占用降回0.4%
  40.   

  41. }
  42.        
  43.        
  44.        
  45. void g()
  46. {
  47.         vector<test> v;
  48.         test x;
  49.         unsigned i=~0UL;
  50.         while(i--);//用来拖时间,在这段时间内用top命令可以看到本程序的内存占用为0.4%
  51.         cout<<"reserve"<<endl;
  52.         v.reserve(20000);
  53.         for(i=0;i<20000;i++)
  54.                 v.push_back(x);
  55.         i=~0UL;       
  56.         while(i--);//用来拖时间,在这段时间内用top命令可以看到本程序的内存占用仍为0.4%,费解
  57.        
  58.         cout<<"clear"<<endl;
  59.        
  60.         v.clear();
  61.         i=~0UL;
  62.         while(1);       
  63. }
  64.                
  65.        
  66. int main()
  67. {
  68.         f();

  69.        
  70. }

复制代码
如果在main中调 f(),这程序执行期间内存占用从不足1M涨到20多M,然后删除map容器中的对象后,又回落到不足1M,这是正常现象

但如果把main中的f()改成g(),把对象放到vector中,则程序在整个运行期间内存使用恒定,不足1M,但通过程序输出可以看到有20000个大对象被一次性创建,然后在clear时被一次性销毁,为什么内存占用恒定在一个很小的值上呢,请各位高人多多指教,谢谢

论坛徽章:
0
2 [报告]
发表于 2010-09-16 17:54 |只看该作者
f函数在哪呢??

论坛徽章:
0
3 [报告]
发表于 2010-09-16 17:59 |只看该作者
回复 2# pengjianbokobe


    不好意思,第一次写错了,现已编辑

论坛徽章:
0
4 [报告]
发表于 2010-09-16 18:12 |只看该作者
可能是建立在堆和建立在栈上的区别吧。

论坛徽章:
0
5 [报告]
发表于 2010-09-18 12:10 |只看该作者
pmap了一下,找到原因了,vector用匿名映射分配内存,在访问对象之前,只建立匿名映射而不分配实际的物理页面。如果在test的拷贝构造函数里加上一句s[0]='a',就能看到内存占用上涨了

vector的clear不会把分配的内存归还给os,但map会。另外,map和vector容器被析构时,容器里的对象所占内存都要释放
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP