STL中deque是我们常说的双端队列,既可以从头添加元素,也可以从尾部添加元素,deque的成员函数和vector的成员函数十分相似,但是它们的内部实现却又很多不同.
 
deque的模板声明:
template < class T, class Allocator = allocator< T> > class deque;
 
1)deque的内存分配方式,deque的内存管理方式比vector复杂.
 
上面程序在执行完最后的push_back后内存分布如下图:
 
 
追踪push_back函数我们看到:
我们先看几个变量的含义, _Myoff成员变量始终表示队头距离存储空间开始位置的元素个数, _DEQUESIZ宏定义如下,可以看到为了避免太小内存块,_DEQUESIZ会根据我们定义类型大小来确定一个block大小.
_Mysize表示队列中实际元素个数,_Map是一个_Ty**类型二级指针,正是挂接block的chunk, 宏_DEQUEMAPSIZ正是_Map的最小分配粒度.
如果存储空间不足时_DEQUESIZ我们要进行内存分配, 可以看到程序根据_Myoff和_Mysize来计算block编号,因此我们可以把_Map看成是一个环,而所有的block也可以看成一个环.在前面计算好block后,
判断该block是否已经分配内存,如果没有则分配内存,如果有则直接对新添加的对象在分配的内存中进行构造.
 
下面我们看下_Growmap函数,这里我做了简化,把copy数据的过程去掉了,我们可以看到在我们重新分配内存大小是以原来chunk大小的一半进行增加,如果增加大小小于最小粒度_DEQUEMAPSIZ,则取最小粒度,
如果用户需求大于我们计算的值,则以用户需求值进行增加,然后释放原来_Map的空间.
 
其他push_front操作和push_back操作类似,只是在计算block位置是不一样, 如下:
 
 
2)deque其他操作,pop_front和pop_back时只是将队头和队尾元素移除,进行insert操作时有点复杂,我们看看插入在一个位置插入多个元素的情况.
上面列出了靠近队头位置时的处理情况,靠近队尾时情况差不多,这里不再贴出,insert的其他重载函数操作类似.
 
deque在进行erase进行移除元素时,要比insert操作简单多了,如下:
 
deque的clear操作和vector不一样,这里clear的话是直接将内存释放掉了.
 
总结:deque在进行内存管理上更复杂,但与vector比较内存管理更加有效,特别是对大量数据序列,不过我们可以看到内存在根据我们的需求不断申请,但是没有释放,如果在数据量波动比较大的地方,可能比较消耗内存,
不过我们可以使用clear函数将内存释放掉,我想clear这么做肯定是考虑到了这个需求.
 
 
 
 
 

最新文章

  1. 面向切面编程AOP
  2. yum安装出错
  3. [转]ASP.NET MVC IOC 之AutoFac攻略
  4. neutron中创建子网时禁用dhcp服务的问题
  5. UNIX环境高级编程笔记之进程控制
  6. openstack 镜像自动扩容 resize拉伸
  7. div没有设置高度时背景颜色不显示(浮动)
  8. 一个mapreduce得到需要计算单词概率的基础数据
  9. 0_Simple__asyncAPI
  10. JDBC+Servlet+jsp(增删查改)
  11. [Java] 设计模式:代码形状 - lambda表达式的一个应用
  12. 页面加载完之前显示Loading
  13. C++系列总结——继承
  14. XUnit 依赖注入
  15. mysql安装密码策略插件
  16. CF767C Garland--树形dp
  17. Java基本数据类型总结、类型转换、常量的声明规范,final关键字的用法
  18. Caffe 使用记录(五):math_functions 分析
  19. ubuntu更新提示/boot空间不足
  20. 【转载】【收藏】Github上免费的编程教程【作者Victor Felder】

热门文章

  1. Redis和Memcache的区别分析 [转]
  2. Understanding Manycore Scalability of File Systems
  3. Javascript 中 null、NaN和undefined的区别
  4. 如何编写规范,灵活,稳定,高质量的HTML和css代码
  5. PS学习笔记
  6. sscanf用法简析
  7. JS数组整理
  8. int([x[, base]]) : 将一个字符转换为int类型,base表示进制
  9. node.js + gulp用JENKINS作CI编译
  10. 修改Tomcat内存大小