在windows中,系統為大家提供了很多種記憶體的分配方式,包括new,malloc(),heapalloc(),virtualalloc()等,那麼它們的區別是什麼呢?彼此有沒有聯絡呢?下面對此來做個比較和總結。
(1)new是c++的運算子,操作的是預設堆,具備編譯器可控制的操作,可以完成c++類物件的構造,適合小型資料的記憶體分配,操作簡單方便。
(2)malloc是c提供的庫函式,操作的是預設堆,適合小型資料的記憶體分配,操作簡單方便。
(3)heapalloc操作的是預設的堆或自定義堆,效率高,適合小型資料或中型資料記憶體分配
(4)virtualalloc()操作的是虛擬記憶體,適合大型資料的記憶體分配。
new、malloc、heapalloc()所操作的堆都是虛擬記憶體的一部分,編譯器或程式無法分辨當前分配的空間是物理記憶體還是在磁碟頁檔案中。在windows系統中,程式在應用層呼叫malloc()和new來分配記憶體,系統最終都會呼叫virtualalloc()函式。但是malloc()和new不是直接呼叫它。malloc()首先呼叫heapalloc(),然後heapalloc()呼叫virtualalloc().heapalloc()就是在自己已經分配好的記憶體上修改自己的屬性。如果heapalloc()失敗了,那麼malloc()會呼叫heapcreate(),重新建乙個堆。heapcreate()首先呼叫virtualalloc()分配乙個比較大的記憶體,這個大小是malloc()函式決定的,比如**中malloc(200),那麼heapcreate()最少會分出4096位元組出來,因為4096正式i386機器的記憶體頁的大小,並且把這4096位元組都設定成不可訪問。heapcreate()後,malloc又去呼叫一次heapalloc(),也就是從這4096位元組大小中劃出200位元組可訪問的記憶體。
c++中new運算子除了呼叫malloc()來分配記憶體外,還對分配的記憶體呼叫了c++類的建構函式進行初始化。
所以,記憶體分配函式的順序是:new->malloc->heapalloc()->virtualalloc()->驅動程式的_pagealloc();
記憶體分配方式
記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的 整個執行期間都存在。例如全域性變數,static 變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函 數執行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指...
記憶體分配方式
記憶體分配方式有三種 1 從靜態儲存區域分配。內存在程式編譯的時候就已經分配好,這塊內存在程式的整個 執行期間都存在。例如全域性變數,static變數。2 在棧上建立。在執行函式時,函式內區域性變數的儲存單元都可以在棧上建立,函式執 行結束時這些儲存單元自動被釋放。棧記憶體分配運算內置於處理器的指令...
記憶體分配方式
乙個由c c 編譯的程式占用的記憶體分為以下幾個部分 1 棧區 stack 由編譯器自動分配釋放 存放函式的引數值,區域性變數的值等。其 操作方式類似於資料結構中的棧。2 堆區 heap 一般由程式設計師分配釋放,若程式設計師不釋放,程式結束時可能由os回 收 注意它與資料結構中的堆是兩回事,分配方...