C++项目定长内存池
Posted Huang_ZhenSheng
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C++项目定长内存池相关的知识,希望对你有一定的参考价值。
解决固定大小的内存申请释放需求
性能达到极致,不考虑内存碎片等问题
第一次:
#include<iostream>
using std::cout;
using std::endl;
template<class T>
class ObjectPool
public:
T* New()
if (RemainBytes < sizeof(T))//如果剩余的内存不足一个对象的大小
_memory = (char*)malloc(128 * 1024);//128KB空间
if (_memory == nullptr)
throw bad_alloc();
T*obj = (T*)_memory;
_memory += sizeof(T);
RemainBytes -= sizeof(T);
return ojb;
void Delete(T* obj)
if (_freeList == nullptr)
_freeList = obj;
//*(int*)obj = nullptr;//32位平台下
*(void**)obj = nullptr;//解引用看void*大小
private:
char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
size_t RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
;
内存的释放:
void Delete(T* obj)
if (_freeList == nullptr)
_freeList = obj;
//*(int*)obj = nullptr;//32位平台下
*(void**)obj = nullptr;//解引用看void*大小
else
*(void**)obj = _freeList;
_freeList = obj;
===》优化成链表的头插
void Delete(T* obj)
*(void**)obj = _freeList;
_freeList = obj;
定长内存池的完整代码的实现:
#include<iostream>
using std::cout;
using std::endl;
template<class T>
class ObjectPool
public:
T* New()
T*obj = nullptr;
//优先把还回来的内存块对象再次重复利用
if (_freeList)
void* next = *(void**)_freeList;
obj = _freeList;//还回来的内存块
_freeList = next;
else
if (_RemainBytes < sizeof(T))//如果剩余的内存不足一个对象的大小
_RemainBytes = 128 * 1024;
_memory = (char*)malloc(_RemainBytes);//128KB空间
if (_memory == nullptr)
throw bad_alloc();
obj = (T*)_memory;
size_t objSize = sizeof(T) < sizeof(void*) ? sizeof(void*) : sizeof(T);
_memory += objSize;
_RemainBytes -= objSize;
//定位new,显示调用T的构造函数初始化
new(obj)T;
return obj;
void Delete(T* obj)
obj->~T()//显示调用析构函数
//链表的头插
*(void**)obj = _freeList;
_freeList = obj;
private:
char* _memory = nullptr;//一个char一个字节,往后方便切出内存块,指向大块内存的指针
void* _freeList = nullptr;//还回来过程中的链接的自由链表指针
size_t _RemainBytes = 0;//大块内存在切分的过程中剩余的字节数
;
以上是关于C++项目定长内存池的主要内容,如果未能解决你的问题,请参考以下文章