谁有内存池的完整代码?

龙哥依旧 2012-02-18 03:05:37
最好c语言写的啊,我要参考一下,谢谢,呵呵
...全文
151 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
gold_water 2012-02-20
  • 打赏
  • 举报
回复
渔村居士 2012-02-19
  • 打赏
  • 举报
回复
Mark!~~~~
程序员小迷 2012-02-19
  • 打赏
  • 举报
回复
ccBufferManager.cpp



/*
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);
}


程序员小迷 2012-02-19
  • 打赏
  • 举报
回复
给个简单的:

ccBufferManager.h



/*
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 nothing

public:
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

RLib 2012-02-18
  • 打赏
  • 举报
回复
http://blog.csdn.net/rrrfff/article/details/7228704

这个相对简单一点
aoluyang12345 2012-02-18
  • 打赏
  • 举报
回复
memory pool, thread pool;
aoluyang12345 2012-02-18
  • 打赏
  • 举报
回复
ace ;there have all you want ;C++
龙哥依旧 2012-02-18
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 kevin_perkins 的回复:]

http://www.codeproject.com/Articles/15527/C-Memory-Pool
[/Quote]
3q我先看一下
Kevin_Perkins 2012-02-18
  • 打赏
  • 举报
回复
http://www.codeproject.com/Articles/15527/C-Memory-Pool

64,661

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧