Chinaunix

标题: 关于vector的push_back的内存增涨问题 [打印本页]

作者: earl808    时间: 2011-01-10 13:35
标题: 关于vector的push_back的内存增涨问题
  1.   1 #include  <vector>
  2.   2 #include  <map>
  3.   3 #include  <string>
  4.   4 #include  <cstdio>
  5.   5 #include  <ctime>
  6.   6 #include  <iostream>
  7.   7
  8.   8 using namespace std;
  9.   9
  10. 10 template<class X>
  11. 11 void tryFun(X& haha)
  12. 12 {
  13. 13     int i=1;
  14. 14     cout<<haha<<endl;
  15. 15 }
  16. 16
  17. 17 int main(int argc, char *argv[])
  18. 18 {
  19. 19     clock_t start=clock();
  20. 20     map<string,int> aaa;
  21. 21     char str[100];//内存使用0%
  22. 22     
  23. 23     for( int i=0 ; i<10000000 ; ++i )
  24. 24     {
  25. 25         sprintf(str,"abcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa%d",i);
  26. 26         aaa[str]=1;
  27. 27     }   
  28. 28     map<string,int>::iterator it=aaa.begin();//内存使用19.6%
  29. 29     vector<string> abc;
  30. 30     for( int i=0 ; i<10000000 ; ++i )
  31. 31     {
  32. 32         abc.push_back(it->first);
  33. 33         ++it;
  34. 34     }   
  35. 35     
  36. 36     
  37. 37     cout<<(clock() - start)/1000<<endl;//内存使用20%
  38. 38 EXIT:
  39. 39     cout<<"aaaa"<<endl;
  40. 40     return 0;
  41.   }
复制代码
为什么vector的push_back几乎没有增加内存?
作者: bruceteen    时间: 2011-01-10 13:41
为什么vector的push_back几乎没有增加内存?
---------
当 size() < capacity() 时不需要重新分配内存
作者: hellioncu    时间: 2011-01-10 13:45
string对象本身也不大吧
作者: earl808    时间: 2011-01-10 13:47
回复 2# bruceteen


    我没有给vector预分配内存啊
作者: earl808    时间: 2011-01-10 13:49
回复 3# hellioncu

直接push_back(string)能涨10%啊
作者: drangon    时间: 2011-01-10 14:03
内存使用19%、20%,这个数据是怎样测量的,贴出原始数据?
作者: earl808    时间: 2011-01-10 14:07
回复 6# drangon


    用top肉眼看的啊
作者: rain_fish    时间: 2011-01-10 14:31
string进行拷贝时,如果不做内容改变,会使用同一块内存,如果内容有改变,才会重新申请空间,所以lz的push_back内存没有明显增长
作者: rain_fish    时间: 2011-01-10 14:43
在push_back后
放入:
41     for( int i=0 ; i<10000000 ; ++i )
42     {
43         abc[i] = "abcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";
44     }


你就看到内存暴涨了
作者: rain_fish    时间: 2011-01-10 14:44
为什么vector的push_back几乎没有增加内存?
earl808 发表于 2011-01-10 13:35



    所以,vector和数组一样,不会出现节省空间的
作者: earl808    时间: 2011-01-10 14:51
回复 9# rain_fish


    我猜push_back不是真的push了一个string,只是个引用而已。假节省。。map的生命一到就要卡很久。
    我有个别的程序莫名其妙的慢,好像就是这个原因
作者: rain_fish    时间: 2011-01-10 14:58
回复  rain_fish


    我猜push_back不是真的push了一个string,只是个引用而已。假节省。。map的生命 ...
earl808 发表于 2011-01-10 14:51



    是string的Copy-On-Write技术
作者: starzhestarzhe    时间: 2011-01-10 15:01
v.size() < v.capacity() 不需要重新分配
还有就是预分配并没有真正的分配内存
作者: earl808    时间: 2011-01-10 15:30
回复 12# rain_fish


    足足能耗掉我1个小时。换种写法马上加快了。copy-on-write后 釜底抽薪要小心啊




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2