C++c/c++

C++内存池原理及设计

2018-08-10  本文已影响88人  XDgbh

参考博客https://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html

1、默认的内存管理函数的不足

2、内存池的定义

3、内存池的分类

1)从线程安全角度分为单线程内存池和多线程内存池
2)从内存池可分配内存单元大小来分为固定内存池和可变内存池

4、固定内存池工作原理


上图中,内存池=4个内存块一个内存块=块头+3个内存单元
与系统内存管理相比,内存池的操作非常迅速,性能优化方面的优点如下:

(1)针对特殊情况,例如需要频繁分配释放固定大小的内存对象时,不需要复杂的分配算法和多线程/多进程保护(系统内存管理一直会加锁解锁)。也不需要维护内存空闲表的额外开销,只需维护简单的内存池块头信息,从而获得较高的性能。
(2)由于开辟一定数量的连续内存空间作为内存池块,因而一定程度上提高了程序局部性和数据访问的速度,提升了程序性能。
(3)比较容易控制页边界对齐和内存字节对齐,没有内存碎片的问题

5、一个单线程的固定内存池的实现

class MemoryPool
{
private:
    MemoryBlock*   pBlock;            //内存池中内存块链表的头指针
    USHORT          nUnitSize;        //内存块中每个内存单元的字节大小
    USHORT          nInitSize;        //第一个内存块内存单元的个数
    USHORT          nGrowSize;        //后面要增加的内存块的内存单元的个数
 
public:
                     MemoryPool( USHORT nUnitSize,
                                  USHORT nInitSize = 1024,
                                  USHORT nGrowSize = 256 );  
                    ~MemoryPool();    //都是函数原型声明,在类外具体实现
 
    void*           Alloc();        //实际的给程序分配内存单元的接口函数
    void            Free( void* p );    //实际的程序释放归还内存单元给内存池的接口函数
};

MemoryBlock为内存池中附着在真正用来为内存请求分配内存的内存块头部的结构体,它描述了与之联系的内存块的使用信息:

struct MemoryBlock
{
    USHORT          nSize;    //本内存块中内存单元的总字节大小
    USHORT          nFree;    //本内存块中空闲的内存单元个数
    USHORT          nFirst;   //本内存块中下一个可用的空闲内存单元下标位置
    USHORT          nDummyAlign1; //虚设的用于字节对齐的2字节,没实际用处
    MemoryBlock*  pNext;    //内存块链表的下一个指针
    char            aData;    //实际内存单元开始的1字节,给出首地址,
            //后面个内存单元地址都在此字节地址基础上加上偏移量(nFirst*nUnitSize)    
 
    //重载new操作符
    static void* operator new(size_t size, USHORT nTypes, USHORT nUnitSize)
    {
        size = sizeof(MemoryBlock) + nTypes * nUnitSize;
        return ::operator new(size);    //调用原始operator new 只分配空间
    }
    static void  operator delete(void *p)
    {
        ::operator delete (p);    //  释放对应的operator new 的空间
    }
 
    MemoryBlock (USHORT nTypes = 1, USHORT nUnitSize = 0);  //nTypes为内存单元个数
    ~MemoryBlock() {}      //内存块不做析构释放内存,交给内存池统一管理
};
上一篇下一篇

猜你喜欢

热点阅读