+ -
当前位置:首页 → 问答吧 → STL vector resize()的内存问题

STL vector resize()的内存问题

时间:2010-09-17

来源:互联网

我测试了一段代码:

代码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快一倍? 搞不明白是什么原因。

谢谢!

作者: gridbird   发布时间: 2010-09-17

第一个快吧
first[j]=j;和c中指针直接定位是一样的。

作者: phy0077   发布时间: 2010-09-17

奇怪的结论啊,怎么看都是代码1 部分快
我去试试

作者: ydfgic   发布时间: 2010-09-17

可以去参考下stl的源码~

作者: davelv   发布时间: 2010-09-17

照道理应该是代码1比较快吧
代码1是空间分配只有一次
代码2在for (int j=0;j<50000;j++)
                        {
                                first.push_back(j);
                        }
              这里的空间分配虽然不是每循环一次就分配一次,但是也会是多次分配的

作者: starzhestarzhe   发布时间: 2010-09-17

回复 gridbird


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

    估计operator[] 操作比push_back慢。

作者: zzyong08   发布时间: 2010-09-17

回复 gridbird
你把resize换成reserve试试。

作者: donglongchao   发布时间: 2010-09-17