当前位置: 首页 > news >正文

网站内容品质惠州网站设计培训

网站内容品质,惠州网站设计培训,有自媒体谁还做网站,网站resize和reserve的区别 reserve:预留空间,但不实例化元素对象。所以在没有添加新的对象之前,不能引用容器内的元素。而要通过调用push_back或者insert。 resize:改变容器元素的数量,且会实例化对象(指定或…

resize和reserve的区别

reserve:预留空间,但不实例化元素对象。所以在没有添加新的对象之前,不能引用容器内的元素。而要通过调用push_back或者insert。

resize:改变容器元素的数量,且会实例化对象(指定或默认0)。因此,调用resize之后,可以直接引用容器内的对象。此时再调用push_back,是加在这个新的空间后面,即size之后的。同样也会触发push_back()的空间预留机制。

如果newSize < size,则该容器后部的元素会被析构,且resize可能会使迭代器失效,对于所有的容器类型,如果resize操作压缩了容器,则指向已删除的元素的迭代器失效。同样的,扩容也可能导致迭代器失效,因为原来迭代器指向的位置的内存已经被释放,因为内存被移动到了别的位置。比如如果count大于size,则会扩容,如果后续空间不够,需要寻找一块足够的空间,然后把元素逐个复制过去。

当元素写入不超过预留空间时,reserve()不涉及内存的重新分配,resize()会涉及内存的重新分配。
reserve()只修改capacity大小,不修改size大小,resize()既修改capacity大小,也修改size大小。
如果reserve和resize的newSize大于capacity,都会涉及内存分配。

申请和写入大内存时三者的差异

以下的代码示例是在Linux平台下运行的。

void test_reserve()
{clock_t start = clock();std::vector<int> arr1;arr1.reserve(1000000000);/* 10^9 * 4 / 1024 / 1024 = 3814MB */for(int i = 0; i < 1000000000; i++){arr1.push_back(i);}std::cout <<"耗时:"<< (clock() - start) << std::endl;std::cout <<"size:"<< arr1.size() << " capacity:" << arr1.capacity() << std::endl;/*耗时:13.52 秒size:1000000000 capacity:1000000000*/
}void test_resize()
{clock_t start = clock();std::vector<int> arr1;arr1.resize(1000000000);/* 10^9 * 4 / 1024 / 1024 = 3814MB */for(int i = 0; i < 1000000000; i++){arr1[i] = i;}std::cout <<"耗时:"<< (clock() - start) << std::endl;std::cout <<"size:"<< arr1.size() << " capacity:" << arr1.capacity() << std::endl;/*耗时:6.39秒size:1000000000 capacity:1000000000*/
}class test
{public:test() {std::cout << "构造" << std::endl; }~test() {std::cout << "析构" << std::endl; }
};int main()
{clock_t start = clock();std::vector<int> arr;/* 10^9 * 4 / 1024 / 1024 = 3814MB */for(int i = 0; i < 1000000000; i++){arr.push_back(i);}std::cout <<"耗时:"<< (clock() - start) << std::endl;std::cout <<"size:"<< arr.size() << " capacity:" << arr.capacity() << std::endl;/*耗时:18.68 秒size:1000000000 capacity:1073741824*/test_reserve();test_resize();return 0;
}

可以看到,reserve相比原生操作快了5秒,而resize后直接通过下标写入,比原生快了12秒,提升还是很可观的。但是前提是要知道元素的个数。
在进程运行的过程中,可以通过shell脚本实时查看进程的内存占用。
这个脚本的意思是:死循环,提取ps aux指令的第一行,即各种参数的标题,并且再提取a.out即程序名的各项信息,之后打印换行,睡眠1秒。达到每隔一秒监控一次内存占用的效果。

while true; 
do ps aux | head -1 ; ps aux | grep a.out; 
printf "————————————————————————————————————————————\n\n" ; sleep 1; 
done

在这里插入图片描述
上图是使用reserve的情况,可以看到VSZ即虚拟内存在调用reserve之后就飙到了4GB,因为Linux是内存延时分配的,即使用了该内存空间才实际分配物理内存。又因为vector的扩容方式是1.5倍扩容,因此可以看到,在push_back的过程中RSS即实际物理内存是逐渐上升的。

在这里插入图片描述
而上图是使用resize的情况,因为resize是实际分配了空间并会实例化元素的,因此物理内存占用上升的非常快,几乎几秒就占满了4GB。

http://www.15wanjia.com/news/168915.html

相关文章:

  • wordpress 微商网站网站建设的心得与体会
  • 建设厅网站更改登陆密码活字格能开发企业网站吗
  • 台州自助建站系统商标做网站logo
  • 建网站公司的资质需要哪些网站建设规划书的目的
  • 内蒙古自治区建设厅官方网站手机网站的特效
  • 嘉兴seo网站推广费用网站开发用盗版犯法
  • 番禺网站建设服务浏阳网站建设卷云网络
  • o2o商城网站搭建做网站app怎么赚钱吗
  • 成都最好的seo外包泰州做网站优化
  • 湘潭网站设计外包公司外贸建站有什么用
  • 开发手机端网站模板下载不了域名访问网站啥意思
  • 莱芜买房网站网站开发的策划书
  • 十大门户网站企业网站商城建设方案
  • 网站关键词怎么做可以排名logo在线设计生成器免费下载
  • 商业网站建设设计张家口手机台app下载
  • 网站首页的功能需求分析百度h5游戏
  • 除了淘宝还有哪些购物网站官方网站建设需要哪个部门审批
  • 编程网站编程谷歌优化培训
  • 免费建靓号网站wordpress页面宽度
  • 300网站建设建设通网站首页
  • 做网站一月能赚50万吗ajax数据库网页网站设计
  • 网站上的动图都怎么做的中国建设工程监理协会官方网站
  • 莱州做网站的公司wordpress 任意下载
  • 网站建设如何包含数据库asp.net c 网站开发
  • 网站建设静态部分报告总结网站规划的基本原则
  • 网站一般做多大像素网站各类模块内容说明
  • 广州定制网站开发动漫制作专业有哪些课程
  • Python做网站难不难做网站需要什么软件教程
  • 广西网站建设的公司营销型企业、公司网站案例
  • 做网站服务器需要自己提供吗济南正规网站建设公司哪家好