大橙子网站建设,新征程启航
为企业提供网站建设、域名注册、服务器等服务
解决固定大小的内存申请释放需求
创新互联专注于酒泉网站建设服务及定制,我们拥有丰富的企业做网站经验。 热诚为您提供酒泉营销型网站建设,酒泉网站制作、酒泉网页设计、酒泉网站官网定制、微信小程序定制开发服务,打造酒泉网络公司原创品牌,更为您提供酒泉网站排名全网营销落地服务。性能达到极致,不考虑内存碎片等问题
第一次:
#includeusing std::cout;
using std::endl;
templateclass 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;
}
定长内存池的完整代码的实现:
#includeusing std::cout;
using std::endl;
templateclass 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;//大块内存在切分的过程中剩余的字节数
};
你是否还在寻找稳定的海外服务器提供商?创新互联www.cdcxhl.cn海外机房具备T级流量清洗系统配攻击溯源,准确流量调度确保服务器高可用性,企业级服务器适合批量采购,新人活动首月15元起,快前往官网查看详情吧