從 adata 開始的區域為記憶體塊用於儲存資料元素的空間,這裡將它稱為資料空間。該資料空間以資料的大小nunitsize劃分為儲存單位,每個儲存單位可以儲存乙個資料。為了對尚未被分配使用的空閒單位進行識別,需要對他們編織序號。在記憶體塊初始化時要編制序號,當記憶體塊被被釋放回記憶體池時也要為他們編制序號,總之記憶體池管理系統是按照序號來識別和管理空閒儲存單位的,至於那些被應用程式占用的單位,則其序號自然消失和失效,直至被程式釋放回記憶體時再由**函式重新為其編號。
顯然對於memoryblock建構函式來講,除了對memoryblock的各個域進行初始化之外,為空閒單位編制序號,即進行空閒單位儲存鍊錶的構建就是它的任務。
綜上,memoryblock的建構函式如下
memoryblock(int nunitsize,int nunitamount):nsize(nunitsize * nunitamount),nfree(nunitamount-1),nfirst(1),pnext(null)
//nunitsize 儲存單位的大小 即 sizeof(t) nunitamount 記憶體塊規模
//nfree 空閒儲存單位為 nunitamount-1 nfirst 初值為1 pnext指向下乙個記憶體塊的指標為null
cout
<<"
-------------呼叫記憶體塊的建構函式-------------------
"<}
因為建構函式的呼叫發生在使用者第一次向記憶體池請求資料儲存單位時,故 儲存區域中的第乙個儲存單位可視為已被分配而不是空閒單位,故需要真正編制序號的是 nunitamount-1個,並且那個用於儲存空閒單位鍊錶頭部序號的nfirst 也被初始化為1
按照物件導向的方法,用於向系統申請記憶體的函式 operator new() 也因該過載於類 memoryblock 中,因為c++ 提供的全域性 operator new 不再適合本例。
void *operatornew(size_t,int nunitsize,int
nunitamount)
其析構函式為
void operator delete(void *pblock) //過載 delete 作為記憶體塊的析構函式
記憶體池設計(五)
將以上 組裝,並自己設計累 user 來測試這個記憶體池 include define mempool alignment 8 對齊長度 using namespace std 記憶體塊及其資訊表 memory block templatestruct memoryblock cout 呼叫記憶體塊...
記憶體管理之記憶體池的設計
如何更好的管理在應用程式中記憶體的使用,同時提高記憶體使用的效率,這是值得每乙個做開發的人深思的問題。記憶體池 memory pool 提供了一種比較可行的解決方案。下面就一般記憶體池的原理與設計進行 一般的記憶體池的使用,分為以下幾個過程 1.建立記憶體池。這個過程的主要任務是預先分配足夠大的記憶...
記憶體池 C 記憶體池
c c 下記憶體管理是讓幾乎每乙個程式設計師頭疼的問題,分配足夠的記憶體 追蹤記憶體的分配 在不需要的時候釋放記憶體 這個任務相當複雜。1.呼叫malloc new,系統需要根據 最先匹配 最優匹配 或其他演算法在記憶體空閒塊表中查詢一塊空閒記憶體,呼叫free delete,系統可能需要合併空閒記...