📄 freelist.h
字号:
/*
* Openmysee
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2 of the License, or
* (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
*
*/
#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;
};
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -