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

抛砖引玉,发一个初学写的自定义内存分配器,该如何解决

2012-03-17 
抛砖引玉,发一个初学写的自定义内存分配器初学重载new,自己写了一个,感觉还算方便,效率完全不保证,主要作

抛砖引玉,发一个初学写的自定义内存分配器
初学重载new,自己写了一个,感觉还算方便,效率完全不保证,主要作用在引玉


/************************************************************************/
/* 版本3(自定义继承模板实现) */
/************************************************************************/
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
{
chardata[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;

[解决办法]
大神, 膜拜
[解决办法]
模板写的还可以,不过你确定要这么多static修饰?
[解决办法]

C/C++ code
#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;};#endif
[解决办法]
C/C++ code
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);} 

热点排行
Bad Request.