list与vector容器如何处理才能避免内存增长?
2015-11-26 15:20
357 查看
Vector容器如何清理?
典型的清理方式是在栈上定义一个空的vector,然后让使用过的vector与之swap。vector容器类的元素连续存放在一块内存区域中,所以删除部分甚至是全部元素后这块已经分配的内存空间并不被回收(主要是为了提高效率),其大小不变。
list容器如何清理?
与此不同,list 类的元素是节点存储方式,每删除一个元素,同时会回收这个元素所占有的内存空间。对于list,就没有这个必要了。其成员函数 remove,erase,pop_front,pop_back,clear等都会回收被删除元素的内存空间。
所以list使用的时候只要最后调用clear方法即可,栈上的头会自动退栈。
为什么top看内存并没有降低?
至于即使释放内存用 top 查看其内存只增不减的问题,是现代编译器普遍采用的一项内存优化策略所导致的,即进程中被释放的内存并不是真正地交给操作系统,而是仍归本进程使用。遇到下一次本进程分配内存的时候优先考虑这块被释放的内存空间,而不必每次都向操作系统提出分配内存的请求,从而可提高内存分配的效率。
典型的清理方式是在栈上定义一个空的vector,然后让使用过的vector与之swap。vector容器类的元素连续存放在一块内存区域中,所以删除部分甚至是全部元素后这块已经分配的内存空间并不被回收(主要是为了提高效率),其大小不变。
list容器如何清理?
与此不同,list 类的元素是节点存储方式,每删除一个元素,同时会回收这个元素所占有的内存空间。对于list,就没有这个必要了。其成员函数 remove,erase,pop_front,pop_back,clear等都会回收被删除元素的内存空间。
所以list使用的时候只要最后调用clear方法即可,栈上的头会自动退栈。
为什么top看内存并没有降低?
至于即使释放内存用 top 查看其内存只增不减的问题,是现代编译器普遍采用的一项内存优化策略所导致的,即进程中被释放的内存并不是真正地交给操作系统,而是仍归本进程使用。遇到下一次本进程分配内存的时候优先考虑这块被释放的内存空间,而不必每次都向操作系统提出分配内存的请求,从而可提高内存分配的效率。
相关文章推荐
- mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法(下)
- JS获取浏览器及屏幕高度和宽度等信息
- javascript需要知道的1
- 再看.net本质
- Joomla, Wordpress, Drupal 全面详细Pk比较-转载
- 阻碍新手程序员提升的8件小事
- android UI学习书籍
- 记录日常遇到的bug君
- 大数据量表的优化查询
- mac os 利用ssh 搭建git server服务器详细教程,以及git基本用法(上)
- Android Volley框架的使用(四)图片的三级缓存策略(内存LruCache+磁盘DiskLruCache+网络Volley)
- 如何谨慎选择企业外部培训师
- Java static{}语句块详解
- Jquery版json_encode
- 使用MFC制作五子棋游戏
- UserInterface的使用总结篇(完结篇)
- 批量给多台Android手机安装APK脚本
- 再次探究复制问题的解法.
- java ibatis 读取mysql blob类型乱码 spring mvc文件下载csv文件乱码
- 常用分词算法笔记