記憶體配置函數分類

來源:互聯網
上載者:User

有4種用於記憶體配置的API函數。虛擬VIRTUAL函數用於分配和管理大數量的記憶體,堆函數HEAP用於小數量記憶體,全域函數GLOBAL及局部函數LOCAL用於小數量記憶體配置,這兩類函數是為了實現與16位系統相容而提供的。WIN32 API仍然維護全域以及局部的堆函數,但是它們都是從局部的2GB中分配記憶體。這些堆對於進程而言都是局部的,不能被其他進程訪問。

       當一個程式需要分配一個至少幾KB緩衝時,使用VIRTUALALLOC函數獲得記憶體塊。它以4KB為單位擷取記憶體,分配的記憶體以4KB來對齊。當程式需要為小對象,數組或者結構分配記憶體時,調用HEAPALLOC函數更合適。將VIRTUALALLOC函數用於對小資料結構的訪問會造成記憶體資源的浪費。

       每個進程都有一個預設堆,但是為了提高效率和便於管理,程式也可以分配額外的堆。每個堆都有自己的控制代碼,調用GETPROCESSHEAP函數獲得預設堆的控制代碼。

       進程中的線程可以訪問進程中的預設堆,WIN32記憶體管理對堆的訪問是串列的。當一個線程執行一個堆函數時,其他線程對記憶體的請求就會被掛起直到函數結束。這樣會給程式帶來很小的延遲。如果一個線程需要訪問一些堆並且不想與其他線程分享這個堆,那麼為線程分配私人堆PRIVATE HEAP要比使用預設堆快得多。線上程使用私人堆的情況下,可以在堆分配時選擇不對堆進行序列化處理。這樣的話,那些需要其他堆空間的其他線程就不會被延遲。如果需要使用方便或者需要代碼緊湊就應使用預設堆,如果需要速度則應使用線程私人堆。

       動態連結程式庫在預設情況下不擁有自己的堆,它與調用它的進程共用堆,DLL可以分配自己的私人堆並使用它。

       當程式使用完堆以後一定要釋放堆。否則會產生記憶體流失MEMORY LEAK。一個規則就是,誰分配誰釋放。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.