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

散分,顺便发个开源的类,无聊的时候一看,该如何解决

2012-02-22 
散分,顺便发个开源的类,无聊的时候一看C/C++ code#pragma once#include stack#include crtdbg.husing

散分,顺便发个开源的类,无聊的时候一看

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版权声明的是楼主。
------解决方案--------------------


可用性不是很好。比如好像没有拷贝构造函数。

[解决办法]
丢人了...
[解决办法]


原来是 小白 啊
[解决办法]
小白
[解决办法]
顶,拿分。
[解决办法]
饿,为什么叫 free_list
……弄VB逆向的时候就有个变态的虚拟机函数叫__vbaFreeVarList,非常令人作呕~
[解决办法]
拿分
[解决办法]
接点分。
[解决办法]
看看~
[解决办法]
谢谢楼主了。
[解决办法]
jiefen
[解决办法]
jie fen
[解决办法]
好像很不安全啦。
[解决办法]
普通应用还将就,
如果要用在类似网络游戏服务器这样的高性能要求应用里,就不合适了。
这里用STL太慢。
建试读一下 linux内核用到的 list.h
[解决办法]
mark
[解决办法]
JF
[解决办法]
感谢楼主

热点排行