回覆列表
-
1 # 使用者1651484189622
-
2 # 藍風24
動態記憶體分配,可以自由的分配指定大小的記憶體空間。當程式執行時,程式設計師並不清楚某一資料需要的具體記憶體空間大小時,可以使用動態分配。
malloc函式原型
void *malloc(int nSize)
分配一個nSize大小的記憶體空間,如果分配成功則返回地址空間的首地址,如果分配失敗則返貨NULL
nSize一般使用 sizeof(型別A)*N 的計算方式獲取大小。意思為:為分配n個型別A所佔空間的大小。
獲取的指標地址需要強制轉換為指定型別
例如:int *p = (int*)malloc(sizeof(int)*100);
使用malloc動態分配的記憶體空間需要使用free函式手動釋放。
malloc是一個庫函式,不同的作業系統上具體實現細節是不同的,以下就以linux條件下進行分析:linux採用的是glibc中堆記憶體管理ptmalloc實現,虛擬記憶體的佈局規定了malloc申請位置以及大小,malloc一次效能申請小記憶體(小於128KB),分配的是在堆區(heap),用sbrk()進行對齊生長,而malloc一次性申請大記憶體(大於128KB時)分配到的是在對映區,而不是在堆區,採用的mmap()系統呼叫進行對映。當然虛擬地址只是規定了一種最理想的狀態,實際分配還是要考慮到物理記憶體加交換記憶體總量的限制,因為每次分配,特別是大記憶體分配採用mmap()對映記憶體需要記錄物理記憶體加交換記憶體地址,所有物理記憶體加交換記憶體限制了malloc實際分配。比如32位情況下,最新版本的linux的對映區在使用者空間區的3G位置,而對映區向下生長,所以理想情況下大概能有2.9GB(除去開始地址128M),如果你的物理記憶體加交換區只有2G,malloc一次申請最多1.8G左右,如果你的物理記憶體加交換區大於4G,那麼最多能有2.9G或者2.8G左右。網上能找到測試程式碼的。