記憶體池是我們經常使用的一種池,常見的池還有程序池、執行緒池和連線池,今天我們就先討論記憶體池。首先看一下池的定義
池:池就是在初始時,申請比剛開始要使用的資源大的多的資源空間,接下來使用時,直接從池中獲取資源。
記憶體池:即在初始時申請分配一定數量的。大小相等的記憶體塊留作備用,此後如有需要直接從該記憶體上進行分配,與傳統的new、melloc申請空間相比,這種機制減少了頻繁從核心中申請空間產生大量的記憶體空間碎片進而降低效能的現象。
記憶體池的實現核心有三步構造記憶體池的節點、申請記憶體池分配記憶體、釋放記憶體並歸還到記憶體池。
接下來我們先了解乙個簡單的記憶體池的構造,記憶體池實際上就是乙個以鍊錶形式進行管理的陣列,有效的避免了陣列刪除、插入時資料的移動。
} //申請空間
void* alloc(size_t size)
pcur->pnext = null;
} void* rt = pool; //分配空間
pool = pool->pnext;//從空閒鍊錶中去除已經分配的空間
return rt;
} //釋放空間,並將空間加入到記憶體池中
void dealloc(void* ptr)
node* pptr = (node*)ptr; //臨時儲存位址
pptr->pnext = pool;//加入到記憶體池
pool = pptr;//修改指向記憶體池的指標
}private:
mem_pool()
mem_pool(const mem_pool&);
class node //記憶體池的個節點
//節點建構函式
public:
t mdata;
node* pnext;
}; node* pool;
static mem_pool* mmp; // 例項化乙個物件
};templatemem_pool* mem_pool::mmp = null;
class cgoods
void* operator new(size_t size)
void operator delete(void* ptr)
private:
std::string mname;
float mprice;
int mamount;
static mem_pool* pmm;
};mem_pool* cgoods::pmm = mem_pool::getinstance();
int main()
乙個簡單的記憶體池
為什仫要使用記憶體池?1.通常我們用new delete和malloc free來管理記憶體,可能會需要頻繁的呼叫記憶體,減少執行時間,增加效率.2.避免記憶體碎片 傳統的new delete的弊端 1.分配記憶體時要檢視空閒分割槽表,根據一定的演算法來分配,比如最佳適應演算法,最差適應演算法.然後...
乙個簡單記憶體池實現
最近面試被問了乙個記憶體池的實現,關鍵是記憶體塊的組織,說來慚愧,由於之前沒有詳細去了解過實現,只記得作業系統上有說過空閒鍊錶的實現,即按分配的塊用鍊錶鏈結,有小塊優先,大塊優先等 後來回來認真地找了幾個記憶體池實現的技術介紹,多數是以乙個固定塊,每個塊又有固定長度的單元組成。參考了網上的一些實現方...
C 實現乙個簡單記憶體池
在使用記憶體池進行記憶體管理之前,通常使用new malloc或者delete free來申請或者釋放記憶體。在這個過程中,系統要首先查詢內部維護的記憶體空閒塊表,並且需要根據比如lru等記憶體分配演算法找到合適大小的空閒記憶體塊。如果該空閒記憶體塊過大,還需要切割成已分配的部分和較小的空閒塊。然後...