对象内存池实现
2014-03-25 12:14
288 查看
/// /// Copyright (c) xseekerj 2014,All Rights Reserved. /// #ifndef _OBJECT_POOL_H_ #define _OBJECT_POOL_H_ #ifndef _POLITE_SZ_ALIGN #define _POLITE_SZ_ALIGN #define sz_align(d,a) (((d) + (a - 1)) & ~(a - 1)) #endif template<typename _Ty, size_t _ElemCount = 1024> class object_pool { typedef struct free_link_node { free_link_node* next; } *free_link; typedef struct chunk_link_node { char data[sz_align(sizeof(_Ty), sizeof(void*)) * _ElemCount]; chunk_link_node* next; } *chunk_link; object_pool(const object_pool&); void operator= (const object_pool&); public: object_pool(void) : _Myhead(nullptr), _Mychunk(nullptr), _Mycount(0) { this->_Enlarge(); } ~object_pool(void) { this->purge(); } void cleanup(void) { if(this->_Mychunk = nullptr) { return; } free_link_node* prev = nullptr; chunk_link_node* chunk = this->_Mychunk; for (; chunk != nullptr; chunk = chunk->next) { char* begin = chunk->data; char* rbegin = begin + (_ElemCount - 1) * sz_align(sizeof(_Ty), sizeof(void*)); if(prev != nullptr) prev->next = reinterpret_cast<free_link>(begin); for (char* ptr = begin; ptr < rbegin; ptr += sz_align(sizeof(_Ty), sizeof(void*)) ) { reinterpret_cast<free_link_node*>(ptr)->next = reinterpret_cast<free_link_node*>(ptr + sz_align(sizeof(_Ty), sizeof(void*))); } prev = reinterpret_cast <free_link_node*>(rbegin); } this->_Myhead = reinterpret_cast<free_link_node*>(this->_Mychunk->data); this->_Mycount = 0; } void purge(void) { chunk_link_node* ptr = this->_Mychunk; while (ptr != nullptr) { chunk_link_node* deleting = ptr; ptr = ptr->next; free(deleting); } _Myhead = nullptr; _Mychunk = nullptr; _Mycount = 0; } size_t count(void) const { return _Mycount; } // if the type is not pod, you may be use placement new to call the constructor, // for example: _Ty* obj = new(pool.get()) _Ty(arg1,arg2,...); void* get(void) { if (nullptr == this->_Myhead) { this->_Enlarge(); } free_link_node* ptr = this->_Myhead; this->_Myhead = ptr->next; ++_Mycount; return reinterpret_cast<void*>(ptr); } void release(void* _Ptr) { ( (_Ty*)_Ptr)->~_Ty(); // call the destructor #ifdef _DEBUG ::memset(_Ptr, 0x00, sizeof(_Ty)); #endif free_link_node* ptr = reinterpret_cast<free_link_node*>(_Ptr); ptr->next = this->_Myhead; this->_Myhead = ptr; --_Mycount; } private: void _Enlarge(void) { static_assert(_ElemCount > 0, "Invalid Element Count"); chunk_link new_chunk = (chunk_link)malloc(sizeof(chunk_link_node)); #ifdef _DEBUG ::memset(new_chunk, 0x00, sizeof(chunk_link_node)); #endif new_chunk->next = this->_Mychunk; this->_Mychunk = new_chunk; char* begin = this->_Mychunk->data; char* rbegin = begin + (_ElemCount - 1) * sz_align(sizeof(_Ty), sizeof(void*)); for (char* ptr = begin; ptr < rbegin; ptr += sz_align(sizeof(_Ty), sizeof(void*))) { reinterpret_cast<free_link_node*>(ptr)->next = reinterpret_cast<free_link_node*>(ptr + sz_align(sizeof(_Ty), sizeof(void*))); } reinterpret_cast <free_link_node*>(rbegin)->next = nullptr; this->_Myhead = reinterpret_cast<free_link_node*>(begin); } private: free_link _Myhead; // link to free head chunk_link _Mychunk; // chunk link size_t _Mycount; // allocated count }; #endif
相关文章推荐
- 单线程固定大小对象的内存池实现
- 单线程不固定大小对象的内存池实现
- c++内存池的实现(可以new复杂对象)
- 一个基于特定对象的内存池实现
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- Java数组反射实现动态的判断一个对象书否是数组,并且对数组进行拆包输出 。。
- 实现一个计数器,能够记录类创建了多少个对象
- 实体实现parcelable接口传递整个对象(购物车逻辑之前)
- Java语言中Object对象的hashCode()取值的底层算法是怎样实现的?
- 如何实现返回记录集的 Visual C++ COM 对象
- Java Robot对象实现服务器屏幕远程监视
- 【c++基础】9.类和对象——类的实现2
- 实现线程的封装, 2种方式(面向对象,基于对象)
- 浅谈权限管理的对象模型和实现
- java对象通用方法之覆盖equals时请遵守通用约定、覆盖equals时总要覆盖hashCode、始终要覆盖toString、考虑实现Comparable接口
- 自定义对象的归档 //类只有实现 NSCoding 协议才具备归档功能 归档最好定义成宏,笔误好发现.
- C语言实现简单的面向对象例子
- EasyDarwin开源流媒体服务器中一种实现对作用域内new对象自动释放的方法(值得借鉴)
- 用DELPHI的RTTI实现数据集的简单对象化
- list集合去除重复对象的实现