散分,顺便发个开源的类,无聊的时候一看
C/C++ code
#pragma once
#include <stack>
#include <crtdbg.h>
using namespace std;
// 对于大量频繁创建和销毁的对象,存在过多的内存分配/释放操作,
// 使用一个空闲列表可以大大减少内存操作的频度,即:
// 当需要创建对象时,从空闲列表头中提取一个,如果空闲列表为空,则创建对象
// 当需要销毁对象时,将其放到空闲列表尾,如果空闲列表已满,则销毁对象
// 实际上,本类还使用了Over-eager evaluation技术,即:
// 每次需要创建对象时,都预计将会需要更多的对象,所以批量创建,返回第一个,
// 并将剩下的放到空闲列表中,等待预计中的创建请求
template<class T>
class FreeList {
public:
// 构造函数,传入列表大小,和批量分配的个数
FreeList(UINT maxFree, UINT batchNew) :
m_maxFree(maxFree), m_batchNew(batchNew), m_batchNewList(NULL) {
m_batchNewList = new T*[batchNew];
};
// 析构函数,清空列表,删除批量创建列表
~FreeList() {
/*
list<T*>::iterator it = m_freeList.begin();
for(; it!= m_freeList.end(); ++it) {
delete (*it);
(*it) = NULL;
}
m_freeList.clear();
*/
while(!m_freeList.empty()) {
T* obj = m_freeList.top();
m_freeList.pop();
delete obj;
}
delete [] m_batchNewList;
m_batchNewList = NULL;
};
public:
// 分配并初始化
T* Allocate() {
// 如果空闲列表非空,则从列表头部提取一个
// 如果为空,则批量创建
T* obj = NULL;
if (!m_freeList.empty()) {
obj = m_freeList.top();
_ASSERTE(_CrtIsValidHeapPointer(obj));
m_freeList.pop();
}
else {
// Over-eager evaluation, 每当需要new的时候,预计会需要更多
// 所以一次产生多个,以减少调用new的次数
for(UINT j = 0; j < m_batchNew; ++j) {
m_batchNewList[j] = new T();
_ASSERTE(_CrtIsValidHeapPointer(m_batchNewList[j]));
if(!m_batchNewList[j]) {
printf("ATS::Allocate() out of memory!!! %d", GetLastError());
break;
}
}
if(j > 0) {
// 留着第一个返回,把后面的全部加到m_freeList中
obj = m_batchNewList[0];
for(UINT i = 1; i < j; ++i) {
m_freeList.push(m_batchNewList[i]);
}
}
}
// 初始化,为以后的使用作准备
if(obj)
obj->Init();
return obj;
};
// 反初始化并释放
void Release(T* obj) {
if(!obj)
return;
_ASSERTE(_CrtIsValidHeapPointer(obj));
// 首先调用反初始化,释放对象可能关联的资源
obj->Uninit();
// 如果空闲列表未满,就放到空闲列表尾
// 如果已满,就销毁对象
if(m_freeList.size() < m_maxFree)
m_freeList.push(obj);
else {
delete obj;
obj = NULL;
}
};
private:
// 空闲的对象列表
stack<T*> m_freeList;
// 空闲对象的最大个数
const UINT m_maxFree;
// 批量创建的对象指针列表
T** m_batchNewList;
// 批量创建的对象个数
const UINT m_batchNew;
};
------解决方案--------------------mark
------解决方案--------------------up
------解决方案--------------------学习,JF
------解决方案--------------------MARK
------解决方案--------------------好好学习 ,大大接分
------解决方案--------------------很好,非常好。很喜欢。
------解决方案--------------------三楼的兄弟,人家的类是开源的,未必就是遵守GPL版权的啊
------解决方案--------------------MARK
------解决方案--------------------八楼的兄弟,发GPL版权声明的是楼主。
------解决方案--------------------