天天看點

malloc的小知識

1.malloc不是直接向作業系統申請,而是先由glibc記憶體管理器收到請求,其配置設定一段記憶體并把記憶體位址傳回給使用者。

2.對于傳回的記憶體位址p,p-4這個位址記錄了malloc空間的大小,這就是當你free時可以直接釋放記憶體而不用指定大小的原因。

3.這個malloc回來的空間大小是8位元組對齊的,也就是每次都是8的倍數。

4.對于p-4這裡記錄malloc空間大小不是空穴來風,而是因為他本身就是屬于一個叫做malloc_chunk的資料結構的一部分,如下圖

malloc的小知識

struct malloc_chunk{

INTERNAL_SIZE_T prev_szie;

INTERNAL_SIZE_T size;

标志位;

使用者資料;

}

5.當運作

第一行定義了申請一個虛拟空間,第二行發生了頁中斷進一步申請了實體空間。

6.運作

得到0x19,去除3個的标志位的影響,得到0x18,真實申請的空間大小也就是24,由20個位元組實作8位元組對齊就可以計算出24。

7.标志位解釋

p = 1 表示上一塊正被使用 pre_size此時通常為0

p  = 0 表示上一塊空閑 pre_size通常為上一塊的大小

M = 1 表示該記憶體塊通過mmap配置設定,隻有配置設定大塊記憶體時才采用mmap,對應釋放要采用munmap_chunk(),否則使用chunk_free()

M = 0 表示不是用mmap配置設定的。

8.malloc每次配置設定至少16位元組,是以每次隻配置設定1、2位元組實際上會造成不必要的浪費。

by: p4inkiller

繼續閱讀