動態記憶體分配指的是在堆上進行分配記憶體,根據申請分配的層次可以分成兩大類:
1、底層:堆記憶體管理函式heapcreate、heapalloc、heapfree、heapdestroy函式
heapcreate函式功能:建立自定義堆,這不同與預設堆由程序建立時系統自動建立。heapalloc函式功能:從自定義堆中分配記憶體。heapfree函式功能:釋放記憶體。但並不能保證所有的物理記憶體都被釋放,系統會根據物理記憶體頁面大小判斷是否釋放**,同時也從效率上考慮不會馬上釋放。heapdestroy函式功能:堆銷毀。堆分配的記憶體全部釋放**。如果沒有顯式呼叫它,則在程序退出時,系統做銷毀的工作。如果是執行緒建立的,則不會隨執行緒退出而釋放,好找習慣是要進行手工釋放。不要等到程序結束時讓系統來做。這樣能提高資源利用率。
還有其它函式,如:getprocessheaps函式:獲取程序所有的堆。heaprealloc函式:修改分配記憶體的大小。heapsize函式:查詢某塊分配記憶體的大小。heapcompact函式:將相鄰的**記憶體塊合併一起。
這些函式組合可進行自定義堆記憶體的分配,它們可以減少記憶體碎片,節省空間。這些記憶體塊通常用來處理某種特定的資料結構,訪問相鄰資料的時間緊湊,大大減少引起的缺頁錯誤。heapcreate函式還可以關閉執行緒同步訪問功能,以獲取程式效能上的提公升。
可以看一下windows 2000下的heapalloc函式**:
void
near* near heapalloc(hheap hhp,
word
cb)
pb = (
void
near*)localalloc(lmem_fixed | lmem_zeroinit, cb);
if
(pb)
((heap near*)0)->calloc++;
_asm
return
pb;
}
2、上層:malloc/free函式和new/delete操作符
malloc/free是c語言中的分配記憶體函式,與作業系統無關,c++繼承了這個函式,另外又提供了new/delete操作符,它們都是通過作業系統的記憶體管理機制實現記憶體管理的。為了申請記憶體,它們通過一定的演算法在堆記憶體中搜尋可用的記憶體,如果是由於記憶體碎片太多而造成的空間不夠,它們會呼叫核心相應的方法增加程式資料段的儲存空間,以獲取合適的記憶體空間,相比於棧來說,它們的效率較低。這種效率低**現在:申請記憶體中它們不可以直接提交,釋放記憶體時又不可以直接**物理記憶體。
可以看一下windows 2000下的malloc函式**:
void
* __cdecl
malloc
(
size_t
sz
)
這裡面的函式內部會呼叫heapalloc函式的。從這方面來看,malloc效率不能與heapallo相比。另外對於new來說效率還不如malloc,在windows作業系統下是按照:
new->malloc->heapalloc->virtualalloc->驅動程式的_pagealloc這個順序呼叫的。
關於詳細的記憶體管理函式說明可參考:
動態記憶體分配
在c 中建立乙個物件時,我們必須要為這個物件申請一塊記憶體,而且要用建構函式對這塊記憶體進行初始化。c 中的new和delete相對於c的庫函式malloc和free在這方面有很大的優勢,所以我們主要講的是運算子new和delete。當用new來建立乙個物件時,它會自動在堆裡為物件分配記憶體並且為這...
動態記憶體分配
為什麼使用動態記憶體分配?c語言中的一切操作都是基於記憶體的 變數和陣列都是記憶體的別名,如何分配這些記憶體由編譯器在編譯期間決定 定義陣列的時候必須指定陣列唱的 而陣列長度是在編譯期就必須決定的 需求 程式執行的過程中,可能需要使用一些額外的記憶體空間 malloc和free malloc和fre...
動態記憶體分配
c的儲存類別有4種 自動的 auto 靜態的 statics 暫存器的 register 外部的 extern 全域性變數時分配在記憶體中的靜態儲存區 靜態區域性變數屬於靜態儲存類別,在靜態儲存區內分配儲存單元,是在編譯時賦初值的,只賦初值一次,在程式執行時它已有初值,以後每次呼叫函式時不再重新賦初...