博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
STL二级空间配置器设计
阅读量:7113 次
发布时间:2019-06-28

本文共 845 字,大约阅读时间需要 2 分钟。

  这里只讲了二级空间配置器,更多关于STL空间配置器的设计,可以参考博客:

举个例子来说明二级控件配置器的设计过程(1-6流程):

1、申请一块7字节的内存

  对齐到8字节倍数,向系统申请8字节的内存(<128字节),由内存池管理。申请内存时发现没有对应的自由链表,向内存池申请8*20字节形成0号自由链表,此时内存池中没有分配到内存,那么系统会向内存中取出一大块内存(大小为8字节*20*2),其中8字节*20分配给0号自由链表,将自由链表的第一个区块分配给客户端,剩下19个区块分配交由自由链表维护;另外的8字节*20留给内存池。

2、申请一块13字节的内存

  将13字节对齐到8字节倍数,向系统申请16字节的内存(<128字节),由内存池管理。发现没有对应的自由链表,向内存池申请16*20字节,形成自由链表。但经过步骤1后内存池中只剩下8*20=160字节,只能提供160/16=10个区块,线程池将池中现有的内存分配给该该自由链表。也就是说,此时1号自由链表只有10个区块,其中第一个区块分配给客户端,剩余的9个区块由自由链表维护。

3、申请一块17字节的内存

  将17字节对齐到24字节,向系统申请24字节的内存(<128字节),有内存池管理。发现没有对应的自由链表,向内存池申请24*20字节,形成自由链表。但经过步骤2后,内存池中已无剩余内存,需要向系统申请。若系统剩余内存,那么同步骤1类似,分配一大块内存,一部分形成自由链表,另一部分由内存池管理。但如果系统此时没有多余内存分配给内存池,那么,就会遍历各个自由链表,将自由链表中还没有使用,并且够大的部分挖出去交给客户端;如果连自由链表中都没有内存了,说明此时内存真的分配不足,调用一级配置器的out-of-memory处理机制,可能会释放其它的内存拿来此时使用,否则的话就只能抛出bad_alloc异常了。

 

转载于:https://www.cnblogs.com/HanEichy/p/4495860.html

你可能感兴趣的文章
Mysql数据类型
查看>>
有关flask的static文件夹,如何设置在blueprint的根目录下呢?
查看>>
图与网络优化---最小费用最大流问题
查看>>
JAVA 内存泄露详解(原因、例子及解决)
查看>>
关于驰骋工作流引擎ccbpm 在工业自动化环境下的 应用演示实例
查看>>
THINKPHP_URL简化设置
查看>>
关于Studio中引用mipmap目录下图片的问题
查看>>
服务器断电后自动重启
查看>>
iOS调节系统音量
查看>>
TextBox灵异事件之背后神秘的深度灵异事件真相揭秘
查看>>
Ubuntu下添加Eclipse快捷方式
查看>>
页面操作 页面放大/缩小 怎么确定恢复正常大小
查看>>
以两军问题为背景来演绎Basic Paxos
查看>>
密码编码技术介绍笔记
查看>>
统计中位值的一般概念
查看>>
gns3模式与使用csr1000v
查看>>
感想二
查看>>
Mangos魔兽世界服务端初探(1)--游戏服务端主体结构与消息分发
查看>>
SonarQube svn 认证失败的解决办法
查看>>
C++string与VC++CString互转
查看>>