内存池问题,有兴趣说两句
在网上看了内存池的一些代码,我有个疑问
假如原内存池初始化时共malloc出32字节的内存,这时候,有一个类在实例化时共需要64字节的空间,所以,池需要向系统再申请32字节的内存,但是,原有的32内存和新申请的32内存是不连续的啊,不是一个Malloc出来的啊,这样子会不会在访问该对象的成员时出现指针异常,或者我本身就理解错了?
同时,求各位大虾,给个相对较简单,并且稳定的内存池代码给我,TKS
[解决办法]
[解决办法]
[解决办法]
一般的内存池的实现原理如下:
一个数组, 各元素指向下面个链表:
链表1: 一系列由 指向 8 字节的堆上内存的指针 组成的链表
链表2: 一系列由 指向 16 字节的堆上内存的指针 组成的链表
链表3: 一系列由 指向 32 字节的堆上内存的指针 组成的链表
链表4: 一系列由 指向 64 字节的堆上内存的指针 组成的链表
链表5: 一系列由 指向 128 字节的堆上内存的指针 组成的链表
链表5: 一系列由 指向 256 字节的堆上内存的指针 组成的链表
开始各链表都是空的
当外部通过此内存池申请N=9 (N<=256)个字节的空间时,
通过计算式 M = (((((N+7)&(~7))>>3)+1)&(~1))<<3,
M=16, 所以它会从链表2中查找有没有可用的,
当前没有, 所以它会向系统申请16个字节大小的内存空间给外部
当外部通过此内存池释放这N个字节的空间时,
通过计算M=16, 所以它会把这块空间加个链表2中
当外部通过此内存池申请N=15 (N<=256)个字节的空间时,
通过计算M=16, 所以它会从链表2中查找有没有可用的,
当前有, 所以它会从链表中取下这个节点, 返回给外部
当外部通过此内存池申请N且N>256个字节的空间时,
直接申请N个字节的空间返回给外部
当外部通过此内存池释放N且N>256个字节的空间时,
直接释放这块内存给系统
我的博客 中也有一个内存池, 与这个的思路不同,
用那个有个特殊条件: 频繁的申请释放大块内存, 用上面的实现就没有意义了
所以具体问题还要具体分析