STL的内存池的设计源码分析和体会
2014-01-14 18:29
295 查看
在一些 服务器端程序设计的时候, 在申请内存 一般要用到内存池。 避免频繁的申请内存 带来的效率问题,
STL源码的 内存池 设计的是128个字节以内 有从内存池子里面去取,但是大于128 个字节了 直接去 malloc 了。
其实倒可以 去借鉴STL的源码 设计出 更满足实际需求的 内存池, 因为在实战中 可能大于128个字节,这要根据具体的数据结构去变化。
STL 在申请内存的时候 做了两级过滤,要是如果用户申请的内存小于128个字节,直接将申请的字节调整为 8的整数倍, 然后从其中去取。
到底是个怎样的情况呢 就是一个数组, 这个数组 每个元素 存放一个指针, 指向实际的内存。
STL里面是16个。 从第一个开始 分别管理的8个字节 16 个字节,32 个字节... 那么第16个 自然是16*8 = 128了哦。
假设 内存池是 free_list[16]; 那么free_list[0]存放的是 8个字节内存的首地址。 然后这个八个字节 指针域 指向 下一个8个字节的内存, 在默认状态下是20个这样的内存 连在一起的。
STL 在设计 这个区域的数据机构的时候用了联合union, 这个举动相当有才。 如果用结构体的话, 每个空闲链表都要多加四个字节的指针来存放, 实在不脱 ,不好安排。
union obj
{
union obj * next;
//数据
......
};
酱紫就避免了浪费 也好处理。
下次写文章 附上 实例代码。
STL源码的 内存池 设计的是128个字节以内 有从内存池子里面去取,但是大于128 个字节了 直接去 malloc 了。
其实倒可以 去借鉴STL的源码 设计出 更满足实际需求的 内存池, 因为在实战中 可能大于128个字节,这要根据具体的数据结构去变化。
STL 在申请内存的时候 做了两级过滤,要是如果用户申请的内存小于128个字节,直接将申请的字节调整为 8的整数倍, 然后从其中去取。
到底是个怎样的情况呢 就是一个数组, 这个数组 每个元素 存放一个指针, 指向实际的内存。
STL里面是16个。 从第一个开始 分别管理的8个字节 16 个字节,32 个字节... 那么第16个 自然是16*8 = 128了哦。
假设 内存池是 free_list[16]; 那么free_list[0]存放的是 8个字节内存的首地址。 然后这个八个字节 指针域 指向 下一个8个字节的内存, 在默认状态下是20个这样的内存 连在一起的。
STL 在设计 这个区域的数据机构的时候用了联合union, 这个举动相当有才。 如果用结构体的话, 每个空闲链表都要多加四个字节的指针来存放, 实在不脱 ,不好安排。
union obj
{
union obj * next;
//数据
......
};
酱紫就避免了浪费 也好处理。
下次写文章 附上 实例代码。
相关文章推荐
- CloudPlatform和CloudStack的关系
- Android开发学习之以CameraAPI方式实现相机功能(二)——相机功能配置
- C# stringFormat 时间格式转换
- 客户端javascript之window
- hook其他进程的API
- C# datatable使用groupby进行分组统计
- Android调用手机新浪微博客户端分享
- Coherence(2)配置
- SQLite学习手册(目录)
- 基于iReport5.5+JavaBean+Struts2(注解方式)的报表设计与查看
- ImageMagick 压缩图片 方法
- Xperf Basics: Recording a Trace(转)
- UVA 125 统计路径条数 FLOYD
- flex 颜色16进制对照表
- Ubuntu网络配置静态IP与hostname使用命令
- 开源项目-Mplayer在windows下的编译总结
- redis多实例重启脚本
- 使用httpclient模拟表单提交,上传图片
- Xperf Analysis Basics(转)
- 大并发 02 select/poll/epoll 工作过程 busy_loop的产生