實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法
模擬STL中的freelist,有這個(gè)思想在內(nèi)。
union obj
{
union obj* next;
char p[1];
};
class MemoryPool
{
public:
MemoryPool()
{
union obj* temp;
m_memory.assign(5,(union obj*)NULL);
for(int i=0;i<m_memory.size();i++)
{
for(int j=0;j<m_memory.size();j++)
{
temp = (obj*)malloc(sizeof(char)*(1<<(i+3)));
temp->next = m_memory[i];
m_memory[i] = temp;
}
}
}
char* mem_get(int size)
{
int j;
if( size > 128)
{
char* start = (char*)malloc(sizeof(char)*size);
return start;
}
int index = freelist_index(size);
obj* temp = m_memory[index];
if(temp == NULL) //
{
for(j = index+1;j<m_memory.size();j++)
{
temp = m_memory[j];
if(temp != NULL)
{
m_memory[j] = temp->next;
break;
}
}
if(j>= m_memory.size())
{
for(int j=0;j<m_memory.size();j++)
{
temp = (obj*)malloc(sizeof(char)*(1<<(index+3)));
temp->next = m_memory[index];
m_memory[index] = temp;
}
temp = m_memory[index];
m_memory[index] = temp->next;
return (char*)temp;
}
else
{
obj* cur;
int up_size = round_up(size);
for(int i=0;i<(1<<(j-index));i++)
{
cur = temp;
cur->next = m_memory[index];
m_memory[index] = cur;
temp = cur+up_size;
}
temp = m_memory[index];
m_memory[index] = temp->next;
return (char*)temp;
}
}
else
{
m_memory[index] = temp->next;
return (char*)temp;
}
}
void mem_free(void* p,int size)
{
if(size > 128)
{
free(p);
return ;
}
obj* temp = (obj*)p;
int index = freelist_index(size);
temp->next = m_memory[index];
m_memory[index] = temp;
}
private:
enum {_ALIGN = 8};//
int freelist_index(int __bytes)
{
return (((__bytes) + (int)_ALIGN-1)/(size_t)_ALIGN - 1);
}
int round_up(int __bytes)
{
return (((__bytes) + (int) _ALIGN-1) & ~((int) _ALIGN - 1));
}
vector<union obj*> m_memory;
};
以上這篇實(shí)現(xiàn)一個(gè)內(nèi)存池管理的類方法就是小編分享給大家的全部內(nèi)容了,希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼
在Matlab下,使用imfill可以很容易的完成孔洞填充操作,下面這篇文章主要給大家介紹了關(guān)于C++ Opencv imfill孔洞填充函數(shù)的實(shí)現(xiàn)思路與代碼,文中通過示例代碼介紹的非常詳細(xì),需要的朋友可以參考下2021-09-09
VSCode下.json文件的編寫之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋
這篇文章主要介紹了VSCode下.json文件的編寫之(1) linux/g++ (2).json中參數(shù)與預(yù)定義變量的意義解釋,本文給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-03-03
c++ 頭文件<cwchar>中常見函數(shù)的實(shí)現(xiàn)代碼
本文記錄了c++ 頭文件<cwchar>中常見函數(shù)的實(shí)現(xiàn),本文結(jié)合實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友參考下吧2023-12-12
VTK8.1?在?Qt5.9?環(huán)境下的配置編譯和安裝過程
為了實(shí)現(xiàn)realsense的PCL點(diǎn)云顯示,需要VTK支持。由于整個(gè)平臺(tái)在Qt環(huán)境實(shí)現(xiàn),VTK編譯為Qt插件。整個(gè)過程并不復(fù)雜,網(wǎng)上的文章大多不全,自己梳理了一下,分享出來,需要的朋友可以參考下2022-07-07
Qt編寫地圖實(shí)現(xiàn)實(shí)時(shí)動(dòng)態(tài)軌跡效果
實(shí)時(shí)動(dòng)態(tài)軌跡主要是需要在地圖上動(dòng)態(tài)顯示GPS的運(yùn)動(dòng)軌跡,也是編寫地圖時(shí)一個(gè)重要的功能。本文將利用Qt實(shí)現(xiàn)這一功能,需要的可以參考一下2022-02-02
C語言實(shí)現(xiàn)學(xué)生消費(fèi)管理系統(tǒng)
這篇文章主要為大家詳細(xì)介紹了C語言實(shí)現(xiàn)學(xué)生消費(fèi)管理系統(tǒng),文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2022-08-08
C語言數(shù)據(jù)結(jié)構(gòu)之二叉鏈表創(chuàng)建二叉樹
這篇文章主要介紹了C語言數(shù)據(jù)結(jié)構(gòu)之?二叉鏈表創(chuàng)建二叉樹,下文我們?yōu)榱烁奖愕氖褂枚鏄浣Y(jié)構(gòu)體,可以使用?typedef?對(duì)結(jié)構(gòu)體進(jìn)行命名,具體內(nèi)容需要的小伙伴可以參考一下2022-02-02
淺談內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別詳解
本篇文章是對(duì)內(nèi)聯(lián)函數(shù)與宏定義的區(qū)別進(jìn)行了詳細(xì)的分析介紹,需要的朋友參考下2013-05-05

