内存分配函数分类
有4種用于內存分配的API函數。虛擬VIRTUAL函數用于分配和管理大數量的內存,堆函數HEAP用于小數量內存,全局函數GLOBAL及局部函數LOCAL用于小數量內存分配,這兩類函數是為了實現與16位系統兼容而提供的。WIN32 API仍然維護全局以及局部的堆函數,但是它們都是從局部的2GB中分配內存。這些堆對于進程而言都是局部的,不能被其他進程訪問。
?????? 當一個程序需要分配一個至少幾KB緩存時,使用VIRTUALALLOC函數獲得內存塊。它以4KB為單位獲取內存,分配的內存以4KB來對齊。當程序需要為小對象,數組或者結構分配內存時,調用HEAPALLOC函數更合適。將VIRTUALALLOC函數用于對小數據結構的訪問會造成內存資源的浪費。
?????? 每個進程都有一個默認堆,但是為了提高效率和便于管理,程序也可以分配額外的堆。每個堆都有自己的句柄,調用GETPROCESSHEAP函數獲得默認堆的句柄。
?????? 進程中的線程可以訪問進程中的默認堆,WIN32內存管理對堆的訪問是串行的。當一個線程執行一個堆函數時,其他線程對內存的請求就會被掛起直到函數結束。這樣會給程序帶來很小的延遲。如果一個線程需要訪問一些堆并且不想與其他線程分享這個堆,那么為線程分配私有堆PRIVATE HEAP要比使用默認堆快得多。在線程使用私有堆的情況下,可以在堆分配時選擇不對堆進行串行化處理。這樣的話,那些需要其他堆空間的其他線程就不會被延遲。如果需要使用方便或者需要代碼緊湊就應使用默認堆,如果需要速度則應使用線程私有堆。
?????? 動態鏈接庫在默認情況下不擁有自己的堆,它與調用它的進程共享堆,DLL可以分配自己的私有堆并使用它。
?????? 當程序使用完堆以后一定要釋放堆。否則會產生內存泄漏MEMORY LEAK。一個規則就是,誰分配誰釋放。
與50位技術專家面對面20年技術見證,附贈技術全景圖總結
- 上一篇: scikit-learn一般实例之一:绘
- 下一篇: Code Snippets