免费注册 查看新帖 |

Chinaunix

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

STL vector resize()的内存问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-09-17 02:04 |只看该作者 |倒序浏览
我测试了一段代码:

代码1:


int main () {

  std::vector<int> first;

        first.resize(100000);

        for (int i=0;i<100000;i++)
        {
                        for (int j=0;j<50000;j++)
                        {
                                first[j]=j;
                        }
        }

  return 0;
}

代码2.:



int main () {

    std::vector<int> first;

        for (int i=0;i<100000;i++)
        {
                        for (int j=0;j<50000;j++)
                        {
                                first.push_back(j);
                        }
                       
                        first.resize(0);
        }

  return 0;
}



结果代码2比代码1至少快了一倍,不知道是什么原因?

vector resize() 函数是不是每次都需要清空内存,如果不清空的话,速度为什么也会比代码1快一倍? 搞不明白是什么原因。

谢谢!

论坛徽章:
1
午马
日期:2013-08-23 23:39:47
2 [报告]
发表于 2010-09-17 07:30 |只看该作者
第一个快吧
first[j]=j;和c中指针直接定位是一样的。

论坛徽章:
0
3 [报告]
发表于 2010-09-17 10:03 |只看该作者
奇怪的结论啊,怎么看都是代码1 部分快
我去试试

论坛徽章:
0
4 [报告]
发表于 2010-09-17 10:12 |只看该作者
可以去参考下stl的源码~

论坛徽章:
0
5 [报告]
发表于 2010-09-17 10:22 |只看该作者
照道理应该是代码1比较快吧
代码1是空间分配只有一次
代码2在for (int j=0;j<50000;j++)
                        {
                                first.push_back(j);
                        }
              这里的空间分配虽然不是每循环一次就分配一次,但是也会是多次分配的

论坛徽章:
0
6 [报告]
发表于 2010-09-17 10:22 |只看该作者
回复 1# gridbird


    我也测试了一下,跟你的结果一样。我用的是glibc++,我看了下push_back 和 operaotr[] 的代码,后者比前者要复杂。前者类似直接赋值,后者要先构造一个迭代器。

    估计operator[] 操作比push_back慢。

论坛徽章:
0
7 [报告]
发表于 2010-09-17 10:57 |只看该作者
回复 1# gridbird
你把resize换成reserve试试。

论坛徽章:
0
8 [报告]
发表于 2010-09-17 11:02 |只看该作者
我用自己的机子试了, 和lz 的结论完全相反
系统是mac os
代码:

1 #include<vector>
  2 using namespace std;
  3
  4 int main()
  5 {
  6     vector<int> tv;
  7 if(0)
  8 {
  9
10     tv.reserve(100000);
11     for(int i = 0; i < 10000; i++)
12     {
13         for(int j = 0; j < 100000; j++)
14         {
15             tv[j] = j;
16         }
17     }
18 }
19 else
20 {
21     for(int i = 0; i < 10000; i++)
22     {
23         for(int j = 0; j < 100000; j++)
24         {
25             tv.push_back(j);
26         }
27 //      tv.resize(0);
28         tv.clear();
29     }
30
31 }
32
33     return 0;
34 }

用reserver 版本,计时是
real        0m7.171s
user        0m6.962s
sys        0m0.010s

用push_back版本是:
real        0m17.409s
user        0m17.342s
sys        0m0.014s
其中 27,28行是一样的效果

论坛徽章:
0
9 [报告]
发表于 2010-09-17 11:05 |只看该作者
回复 8# ydfgic
LZ用的resize,你用的reserve。。。。

论坛徽章:
0
10 [报告]
发表于 2010-09-17 11:22 |只看该作者
回复 9# donglongchao


    我知道, 楼主本意就应该是reserve 的, 我也用resize过的,resize和reserve是一个效果, 时间计时也是一样的
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP