1. 程式人生 > >linux下brk、mmap、malloc和new的區別

linux下brk、mmap、malloc和new的區別

答:brk是系統呼叫,主要工作是實現虛擬記憶體到記憶體的對映,可以讓程序的堆指標增長一定的大小,邏輯上消耗掉一塊虛擬地址空間,malloc向OS獲取的記憶體大小比較小時,將直接通過brk呼叫獲取虛擬地址。

mmap是系統呼叫,也是實現虛擬記憶體到記憶體的對映,可以讓程序的虛擬地址區間切分出一塊指定大小的虛擬地址空間vma_struct,一個程序的所有動態庫檔案.so的載入,都需要通過mmap系統呼叫對映指定大小的虛擬地址區間,被mmap對映返回的虛擬地址,邏輯上被消耗了,直到使用者程序呼叫unmap,會回收回來。malloc向系統獲取比較大的記憶體時,會通過mmap直接對映一塊虛擬地址區間。

       malloc是C語言標準庫中的函式,主要用於申請動態記憶體的分配,其原理是當堆記憶體不夠時,通過brk/mmap等系統呼叫向核心申請程序的虛擬地址區間,如果堆內部的記憶體能滿足malloc呼叫,則直接從堆裡獲取地址塊返回。

new是C++內建操作符,用於申請動態記憶體的分配,並同時進行初始化操作。其實現會呼叫malloc,對於基本型別變數,它只是增加了一個cookie結構, 比如需要new的物件大小是 object_size, 則事實上呼叫 malloc 的引數是 object_size + cookie, 這個cookie 結構存放的資訊包括物件大小,物件前後會包含兩個用於檢測記憶體溢位的變數,所有new申請的cookie塊會連結成雙向連結串列。
對於自定義型別,new會先申請上述的大小空間,然後呼叫自定義型別的建構函式,對object所在空間進行構造。