解決固定大小的內(nèi)存申請釋放需求
創(chuàng)新互聯(lián)專注于酒泉網(wǎng)站建設(shè)服務(wù)及定制,我們擁有豐富的企業(yè)做網(wǎng)站經(jīng)驗(yàn)。 熱誠為您提供酒泉營銷型網(wǎng)站建設(shè),酒泉網(wǎng)站制作、酒泉網(wǎng)頁設(shè)計、酒泉網(wǎng)站官網(wǎng)定制、微信小程序定制開發(fā)服務(wù),打造酒泉網(wǎng)絡(luò)公司原創(chuàng)品牌,更為您提供酒泉網(wǎng)站排名全網(wǎng)營銷落地服務(wù)。性能達(dá)到極致,不考慮內(nèi)存碎片等問題
第一次:?
#includeusing std::cout;
using std::endl;
templateclass ObjectPool
{
public:
T* New()
{
if (RemainBytes< sizeof(T))//如果剩余的內(nèi)存不足一個對象的大小
{
_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一個字節(jié),往后方便切出內(nèi)存塊,指向大塊內(nèi)存的指針
void* _freeList = nullptr;//還回來過程中的鏈接的自由鏈表指針
size_t RemainBytes = 0;//大塊內(nèi)存在切分的過程中剩余的字節(jié)數(shù)
};
內(nèi)存的釋放:
void Delete(T* obj)
{
if (_freeList == nullptr)
{
_freeList = obj;
//*(int*)obj = nullptr;//32位平臺下
*(void**)obj = nullptr;//解引用看void*大小
}
else
{
*(void**)obj = _freeList;
_freeList = obj;
}
}
===》優(yōu)化成鏈表的頭插
void Delete(T* obj)
{
*(void**)obj = _freeList;
_freeList = obj;
}
定長內(nèi)存池的完整代碼的實(shí)現(xiàn):
#includeusing std::cout;
using std::endl;
templateclass ObjectPool
{
public:
T* New()
{
T*obj = nullptr;
//優(yōu)先把還回來的內(nèi)存塊對象再次重復(fù)利用
if (_freeList)
{
void* next = *(void**)_freeList;
obj = _freeList;//還回來的內(nèi)存塊
_freeList = next;
}
else
{
if (_RemainBytes< sizeof(T))//如果剩余的內(nèi)存不足一個對象的大小
{
_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,顯示調(diào)用T的構(gòu)造函數(shù)初始化
new(obj)T;
return obj;
}
void Delete(T* obj)
{
obj->~T()//顯示調(diào)用析構(gòu)函數(shù)
//鏈表的頭插
*(void**)obj = _freeList;
_freeList = obj;
}
private:
char* _memory = nullptr;//一個char一個字節(jié),往后方便切出內(nèi)存塊,指向大塊內(nèi)存的指針
void* _freeList = nullptr;//還回來過程中的鏈接的自由鏈表指針
size_t _RemainBytes = 0;//大塊內(nèi)存在切分的過程中剩余的字節(jié)數(shù)
};
你是否還在尋找穩(wěn)定的海外服務(wù)器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機(jī)房具備T級流量清洗系統(tǒng)配攻擊溯源,準(zhǔn)確流量調(diào)度確保服務(wù)器高可用性,企業(yè)級服務(wù)器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧