首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

哪位高手有内存池的完整代码

2012-03-12 
谁有内存池的完整代码?最好c语言写的啊,我要参考一下,谢谢,呵呵[解决办法]http://www.codeproject.com/Art

谁有内存池的完整代码?
最好c语言写的啊,我要参考一下,谢谢,呵呵

[解决办法]
http://www.codeproject.com/Articles/15527/C-Memory-Pool
[解决办法]
ace ;there have all you want ;C++
[解决办法]
memory pool, thread pool;
[解决办法]
http://blog.csdn.net/rrrfff/article/details/7228704

这个相对简单一点
[解决办法]
给个简单的:

ccBufferManager.h

C/C++ code
/* Written by cc_team*/#ifndef CC_BUFFER_MGR_H#define CC_BUFFER_MGR_H//#include "ccCommon.h"//#include "ccVector.h"#include <vector>#include <iostream>using namespace std;typedef struct _BufInfo{    void *  buf;    int        size;}BufInfo;class CCBufferMgr{public:    CCBufferMgr(int size = /*PAGE_SIZE*/ 4096):size(size)     {    buf = new char[size];    BufInfo bufInfo = {buf, size};    unusedBufVec.push_back(bufInfo);//    usedBufVec.setReallocSizeUnit(1024);//    unusedBufVec.setReallocSizeUnit(1024);    }    ~CCBufferMgr()    {    delete []buf;    }public:    int getSize() const { return size; }    void * getBufPtr() const { return buf; }public:    void *  askOneBuffer(int bufSize);        // if no avaiable buf, return NULL    bool    returnBackBuffer(void * buf);   // if return false, the buf isn't allocated from the mgr, it will do nothingpublic:    void show() const;public:    void setReallocSizeUnit(int    newReallocSizeUnit);private:    void askTwoBuffer( void ** bufOne, int sizeOne, void ** bufTwo , int sizeTwo);private:    CCBufferMgr(const CCBufferMgr & bufMgr);    CCBufferMgr & operator=(const CCBufferMgr & bufMgr);private:    void *  buf;    int        size;    //CCVector<BufInfo> usedBufVec;    //CCVector<BufInfo> unusedBufVec;    vector<BufInfo> usedBufVec;    vector<BufInfo> unusedBufVec;};template<class T>class BaseAlloc{public:    static void* operator new(size_t size)    {        void* pRet = NULL;        if(!m_freelist)        {            m_freelist = ::new Node;            m_freelist->next = NULL;            for(int i = 0;i < INCREMENT - 1;++i)            {                Node* p = ::new Node;                p->next = m_freelist;                m_freelist = p;            }            m_total += INCREMENT;        }        ++m_alloc;        pRet = reinterpret_cast<void*>(m_freelist->data);        m_freelist = m_freelist->next;        return pRet;    }    static void operator delete(void* pr,size_t size)    {        Node* p = reinterpret_cast<Node*>(pr);        p->next = m_freelist;        m_freelist = p;        if(m_total - --m_alloc > DIFFSIZE)        {            for(int i = 0;i < RELEASESIZE;++i)            {                Node* p = m_freelist;                m_freelist = m_freelist->next;                ::delete p;            }            m_total -= RELEASESIZE;            cout << "Release One Time" << endl;        }    }private:    struct Node    {        char data[sizeof(T)];        Node* next;    };    static Node* m_freelist;    static int m_alloc;    static int m_total;    enum     {        INCREMENT = 64,        DIFFSIZE = 1024,        RELEASESIZE = 512,    };};template<class T>typename BaseAlloc<T>::Node* BaseAlloc<T>::m_freelist = NULL;template<class T>int BaseAlloc<T>::m_alloc = 0;template<class T>int BaseAlloc<T>::m_total = 0;#endif
[解决办法]
ccBufferManager.cpp



C/C++ code
/* Written by cc_team*/#include "ccBufferMgr.h"void * CCBufferMgr::askOneBuffer( int bufSize ){    int size = unusedBufVec.size();    if(size < 1)    return NULL;    for(int i = 0; i < size; ++i)    {    BufInfo bufInfo = unusedBufVec[i];    if(bufSize <= bufInfo.size)    {        if(bufSize < bufInfo.size)        {        BufInfo extraBuf = {(char *)bufInfo.buf + bufSize, bufInfo.size - bufSize};        unusedBufVec.push_back(extraBuf);        }        bufInfo.size = bufSize;        usedBufVec.push_back(bufInfo);        //unusedBufVec.erase(&unusedBufVec[i]);        unusedBufVec.erase(unusedBufVec.begin() + i);           return bufInfo.buf;    }    }    return NULL;}bool CCBufferMgr::returnBackBuffer( void * buf ){    for(int i = 0; i < usedBufVec.size(); ++i)    {    BufInfo bufInfo = usedBufVec[i];    if(bufInfo.buf == buf)    {        //usedBufVec.erase(&usedBufVec[i]);        usedBufVec.erase(usedBufVec.begin() + i);        unusedBufVec.push_back(bufInfo);        return true;    }    }    return false;}void CCBufferMgr::askTwoBuffer( void ** bufOne, int sizeOne, void ** bufTwo , int sizeTwo){    void * buf = askOneBuffer(sizeOne);    if(buf == NULL)    {    *bufOne = *bufTwo = NULL;    return;    }    *bufOne = buf;    buf = askOneBuffer(sizeTwo);    if(buf == NULL)    {    *bufTwo = NULL;    }}void CCBufferMgr::show() const{    std::cout << "CCBufferMgr " << this << ": " << std::endl;    for(int i = 0; i < usedBufVec.size(); ++i)    {    const BufInfo * info = &usedBufVec[i];    std::cout << "Used BufInfo: " << info->buf << ", " << info->size << std::endl;    }    for(int i = 0; i < unusedBufVec.size(); ++i)    {    const BufInfo * info = &unusedBufVec[i];    std::cout << "Unused BufInfo: " << info->buf << ", " << info->size << std::endl;    }    std::cout << std::endl;}void CCBufferMgr::setReallocSizeUnit( int newReallocSizeUnit ){//    usedBufVec.setReallocSizeUnit(newReallocSizeUnit);//    unusedBufVec.setReallocSizeUnit(newReallocSizeUnit);}
[解决办法]
Mark!~~~~
[解决办法]

热点排行
Bad Request.