变长内存池的设计概要

变长内存池,听起来感觉很是高大上,其实也是很简单的一种定长内存池的多维度管理。
我设计开发的变长内存池就是完全基于这种思想:
1.首先定义最小分配长度=32,为了兼容ARM CPU,一定要确保分配的内存地址是4的整数倍。
2.以32的倍数作为长度维度,意思是说当前申请的内存长度可以通过计算定位到合适的长度维度 ,例如:一次申请78个字节长度,则78/32=2(倍数),78%32=14(余数),定位的长度维度=3(322+14),那么该次内存申请将在长度维度3上操作。
3.在每个长度纬度(N)上实现定长(L)内存池,L=N
32。定长内存池的实现一定不要用STL的数据结构,要自己实现一个基于单链表的队列,因为STL中的缺省内存适配器将会调用malloc和free,与内存池的思想和目标不符。
4.长度维度最大值不要超过128*1024,因为对于linux系统来说,一次申请128K以上(含)的内存,系统将以內存映射文件的方式分配,不通过glibc,释放时会立即归还给操作系统,不会产生内存碎片。
5.变长内存池最合适的使用场景:替换掉STL缺省的内存适配器(memory_allocator)。
我见过不少开发人员在程序中使用了变长内存池却不替换掉STL缺省的内存适配器,代码中大量使用STL使得内存碎片激增,内存的使用更是居高不下,这是典型的内存池的错误使用,必须用内存池替换掉STL的缺省内存适配器,切记,切记,切记!!!

发布了19 篇原创文章 · 获赞 5 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qman007/article/details/103956403
今日推荐