没有合适的资源?快使用搜索试试~ 我知道了~
首页侯捷解读:MemoryPool设计哲学与无痛运用
侯捷解读:MemoryPool设计哲学与无痛运用
需积分: 10 19 下载量 40 浏览量
更新于2024-07-17
收藏 1.39MB PDF 举报
"池内春秋—MemoryPool的设计哲学和无痛运用"是一篇由计算机技术作家侯捷撰写的深度探讨文章,针对内存管理中的关键概念MemoryPool进行阐述。侯捷以其丰富的经验和深厚的专业背景,结合早期计算机内存限制的历史背景,解释了为何在过去的年代中MemoryPool(内存池)的设计如此重要。 在那个内存资源极度稀缺的时代,每个程序员都必须精细管理内存,因为即使是节省几十个字节的空间也可能意味着巨大的性能提升。例如,MS-DOS 5.0引入的寻址技术如UMB和HMA,极大地扩展了内存使用空间,被视为技术上的重大突破。然而,随着虚拟内存和现代操作系统的发展,内存不再成为程序员的瓶颈,人们开始关注代码效率和软件架构,而非单纯的内存节省。 文章详细介绍了MemoryPool的设计哲学,它旨在减少内存分配和释放操作的开销,通过预先分配大量连续内存并维护一个自由区(free block)列表,从而避免频繁的系统调用。此外,侯捷还讨论了SGI STL中的内存池实现,特别是区块卸除(归还)机制的剖析,以及如何通过优化内存分配策略提高编译程序的区块配置性能。 对于那些具备一定C++编程经验的读者,这篇文章提供了深入理解内存管理底层工作的机会,不仅包括理论分析,还有实用技巧和编译器特定的考量。通过阅读,读者不仅能学习到如何无痛地运用MemoryPool,还能从中获取如何改进和优化内存管理的最佳实践。 这是一篇既回顾历史又展望未来的文章,对那些希望提高程序性能和内存效率的开发者来说,具有很高的参考价值。
资源详情
资源推荐
![](https://csdnimg.cn/release/download_crawler_static/10957890/bg6.jpg)
6 池内春秋— Memory Pool 的设计哲学和无痛运用
侯捷观点
找出最适合需求的㆒块完整空间。System heap 愈杂乱、区块大小愈是参差不等,
找出㆒个适当(够大)区块的时间愈可能长久
5
。
overhead!
pa
图㆔/ 每个由 system heap 配置而来的内存区块,前端都带有㆒块「小甜饼」,大小
通常为 4 bytes,用来记录区块大小。
空间额外开销之明证欲证明你所配置的每㆒个内存区块都带有「小甜饼」,很简
单,只要观察动态配置得来的指针,看看其前方是否有所记录?记录值是否就是区
块本身的大小?同时并观察数个连续动态配置的区块是否完全紧邻?亦或㆗间有些
缝隙?缝隙的
大小是否刚好 4bytes?
㆘面这段程序代码刻意安排特定的对象大小,然后动态配置它们(并建构之),然
后打印其前㆕个 bytes,观察其内数值,印证是否和区块的大小相同。最后并观察
这些区块的起始地址。由于只做简单观察之用,所以编程手法直观而不讲究。
// 动态配置内存
C1* pc1 = new C1; // size:16
C1* pc12 = new C1; // size:16
5
感谢孟岩先生对于 malloc()提供以㆘补充说明:Memory Pool 主要是针对 native API
malloc 或 operator new 不够高效而开发。这种情况在以前比较多见。后来很多㆟都开
始 针对这个问题进行深入研究。1986 年起 Doug Lea 潜心研究 malloc 算法,逐渐发
展 出比较好的作法,被称为 DL Malloc,目前 Linux 的 glibc ㆗的 malloc 算法就是
直接 来自 Doug Lea,其他平台的 malloc 实作品多少也受到 DL 的影响。总的来说,
如今的
malloc 比以前快很多,这可能是为什么 PJ Plauger 等直接使用 operator new 实作
allocator 的原因。Doug Lea 主页:http://gee.cs.oswego.edu/dl/,其㆗可㆘载 DL Malloc
源码。
Cookie
(记录区块大
小)
区块
![](https://csdnimg.cn/release/download_crawler_static/10957890/bg7.jpg)
池内春秋— Memory Pool 的设计哲学和无痛运用 7
侯捷观点
C1* pc13 = new C1; // size:16
C2* pc2 = new C2; // size:14
C3* pc3 = new C3; // size:24 C4* pc4
= new C4; // size:160 int* pi = new
int[10]; // size:40
// 打印每个区块之前的㆕个 bytes
unsigned char* pc1c = (unsigned char*)pc1; unsigned char* pc12c =
(unsigned char*)pc12; unsigned char* pc13c = (unsigned char*)pc13;
unsigned char* pc2c = (unsigned char*)pc2; unsigned char* pc3c =
(unsigned char*)pc3; unsigned char* pc4c = (unsigned char*)pc4; unsigned
char* pic = (unsigned char*)pi; printf("%d,%d,%d,%d \n", *(pc1c-4),
*(pc1c-3), *(pc1c-2), *(pc1c-1) ); printf("%d,%d,%d,%d \n", *(pc12c-4),
*(pc12c-3), *(pc12c-2), *(pc12c-1) ); printf("%d,%d,%d,%d \n", *(pc13c-4),
*(pc13c-3), *(pc13c-2), *(pc13c-1) ); printf("%d,%d,%d,%d \n", *(pc2c-4),
*(pc2c-3), *(pc2c-2), *(pc2c-1) ); printf("%d,%d,%d,%d \n", *(pc3c-4),
*(pc3c-3), *(pc3c-2), *(pc3c-1) ); printf("%d,%d,%d,%d \n", *(pc4c-4),
*(pc4c-3), *(pc4c-2), *(pc4c-1) ); printf("%d,%d,%d,%d \n", *(pic -4),
*(pic -3), *(pic -2), *(pic -1) );
// 打印每㆒区块的起始地址
printf("%p %p %p %p %p %p %p \n", pc1,pc12,pc13,pc2,pc3,pc4,pi);
图㆕是以㆖片段的某次执行结果。我们看到 C++Builder5 在这方面的表现最为「㆗
规㆗矩」,完全符合我们的预期,不仅 cookie 记录「正确」,每个区块的距离也恰
恰是区块大小加㆖ 4(cookie 大小)。GCC 产生的每个 cookie 记录的似乎都是区块
实际大小加㆖ 1001(㆓进制),像是某种神秘标记;每个区块距离则是区块大小加
㆖ 8,但也有例外(红色标示)。VC6 产生的每个 cookie 以及区块的距离最难推断
规律性,并且也有十分离奇的现象(红色标示)。这些离奇现象其实不难理解:我
们在测试程序㆗连续配置数个区块,但 malloc()
或
::operator new 并不㆒定就在
system heap ㆗找到连续空间,这时候 cookie 之㆗有某种「神秘」记录是很容易想
象的。就连 C++Builder 也不见得㆒直会有㆖述那么「㆗规㆗矩」的表
现。
VC6 CB5 GCC2.91
16
剩余31页未读,继续阅读
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![whl](https://img-home.csdnimg.cn/images/20210720083646.png)
![](https://profile-avatar.csdnimg.cn/248d103ed12e41e685b6da1fa8df0b5b_josean.jpg!1)
josean
- 粉丝: 10
- 资源: 153
上传资源 快速赚钱
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![](https://csdnimg.cn/release/wenkucmsfe/public/img/voice.245cc511.png)
最新资源
- Vue实现iOS原生Picker组件:详细解析与实现思路
- Arduino蓝牙小车:参数调试与功能控制
- 百度Java面试精华:200页精选资源涵盖核心知识点
- Swift使用CoreData填坑指南:CoreData在Swift 3.0的变化
- 微距离无线充电器创新设计及其实验探索
- MTK Android平台开发全攻略:44步详解流程
- RecyclerView全面解析:替代ListView的新选择
- Android开发:自动适配中英文键盘解决方案
- Android调用WebService接口教程
- Android开发:BitmapUtil图片处理全解析与实例
- Android多线程断点续传实现详解
- PCA算法在人脸识别会议签到系统中的应用
- EventBus 3.0:Android事件总线详解与实战应用
- Android FileUtil:全面解析文件操作实用技巧与实例
- RecyclerView添加头部和尾部实战教程
- Android实现微博滑动固定顶部栏实战与优化
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035711.png)
![](https://img-home.csdnimg.cn/images/20220527035111.png)
安全验证
文档复制为VIP权益,开通VIP直接复制
![](https://csdnimg.cn/release/wenkucmsfe/public/img/green-success.6a4acb44.png)