快速业务通道

内存池的C++实现(可能还有小bug)

作者 佚名技术 来源 程序设计 浏览 发布时间 2012-06-29

最近在学习c++程序性能优化,读到内存池部分。自己动手写了一个,小小测试了一下应 该没有问题。

内存块MemoryBlock声明文件

MemoryBlock.h

#pragma once
#define USHORT unsigned short
#define ULONG unsigned long
#include <iostream>
using namespace std;
//内存块
struct MemoryBlock
{
    USHORT m_nSize;//可分配内存总大小
    USHORT m_nFree;//可分配内存单元数目
    USHORT m_nFirst;//第一个可用的内存单元位置
    MemoryBlock* m_pNext;//指向下一个内存块
    char m_data[1];
    void* operator new(size_t,const USHORT& sum,const USHORT& unit_size)
    {
        return ::operator new(sizeof(MemoryBlock)+sum*unit_size);//申请一 个内存块空间
    }
    void operator delete(void* del,size_t)
    {
        ::operator delete(del);//删除内存块空间
    }
    MemoryBlock(const USHORT& sum,const USHORT& unit_size)
        :m_nSize(sum*unit_size),m_nFree(sum-1),m_nFirst(1),m_pNext(0)
    {
        char* pData=m_data;
        for(int i=1;i<sum;i++) //初始化1到sum-1指向
        {
            *reinterpret_cast<USHORT*>(pData)=i;
            pData+=unit_size;
        }
    }
    ~MemoryBlock(){}

};

内存池MemoryPool声明文件

MemoryPool.h

#pragma once
#include "MemoryBlock.h"

//内存池 a very good memory manager
class MemoryPool
{
private:
    USHORT m_nUnitSize;//一个可分配单元的大小
    USHORT m_nInitSize;//第一个可分配空间数目
    USHORT m_nGrowSize;//新增的可分配空间数目
    MemoryBlock* m_pFirst;//指向第一个内存块
public:
    //单元大小,第一个内存块的可分配空间数目,第二个内存块之后的可分配空间数目
    MemoryPool(const USHORT& unit_size,const USHORT& init_size=2048,const USHORT& grow_size=1024);
    ~MemoryPool(void);
    void* Alloc();//分配内存
    void Free(void* pfree);//回收内存
    void FreeMemoryBlock(MemoryBlock *pblock);//销毁
};

内存池MemoryPool实现文件

MemoryPool.cpp

#include "MemoryPool.h"

const USHORT MEMPOOL_ALIGNMENT=2;


MemoryPool::MemoryPool(const USHORT &unit_size, const USHORT &init_size, const USHORT &grow_size)
    :m_pFirst(0),
     m_nInitSize(init_size),
     m_nGrowSize(grow_size)
{
    if(unit_size>4)
    {
        m_nUnitSize = (unit_size + (MEMPOOL_ALIGNMENT-1)) & ~ (MEMPOOL_ALIGNMENT-1);
        //m_nUnitSize 取整到大于unit_size的最大的MEMPOOL_ALIGNMENT的倍 数.
        //令人纠结的注释
    }
    else if(unit_size>=2)
        m_nUnitSize=4;
    else
        m_nUnitSize=2;
}

void* MemoryPool::Alloc()
{
    if(!m_pFirst) //如果是第一次申请
    {
        MemoryBlock* pmb_first=new (m_nInitSize,m_nUnitSize)MemoryBlock (m_nInitSize,m_nUnitSize);//14日凌晨至此
        m_pFirst=pmb_first;
        return (void*)pmb_first->m_data;
    }
    MemoryBlock* pmb_block=m_pFirst;
    while(pmb_block&&pmb_block->m_nFree==0)

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号