Win內存分配函數(GlobalAlloc/HeapAlloc/LocalAlloc/VirtualAlloc)html
來源:http://blog.csdn.net/chunyexiyu/article/details/39320805算法
參考:編程
Windows MSDNwindows
http://msdn.microsoft.com/en-us/library/aa908768.aspx安全
附助資料:數據結構
http://blog.csdn.net/susubuhui/article/details/7315094less
http://wenku.baidu.com/link?url=yxgCWePPV1kFaIUciEspYgm34wNAnMLDoduBlfsEEo-mW0JFRVEOkixomUjPatqw_jOXZcqQ1CLoeBSZqLuse1KiyHD6ysZTMIzLy_sPgPS函數
http://blog.csdn.net/sharecode/article/details/7464915工具
Owed by: 春夜喜雨 http://blog.csdn.net/chunyexiyu 轉載請標明來源 post
對於Windows來講,提供了一些API接口進行Heap內存管理,是獨立於C++/C程序以外的,僅用於Windows平臺的API。
大概分爲下面幾組接口:
老的Heap接口GlobalXXX(新程序不建議使用,這些函數存在主要是兼容之前寫的程序):
GlobalAlloc/GlobalRelloc/GlobalFree:從Heap申請一塊內存
GlobalLock/GlobalUnlock: 從GlobalAlloc的內存中申請一段內存
函數參數:
新的Heap接口HeapXXX:
HeapCreate/HeapDestroy/GetProcessHeap:從Heap中申請一塊內存
HeapAlloc/HeapRelloc/HeapFree/HeapSize:從HeapCreate的內存中申請一段內存
HeapValidatee:查詢Heap或Alloc的信息
當前進程Heap內存接口LocalXXX:
LocalAlloc/LocalReAlloc/LocalFree/LocalSize:從當前Heap的內存中申請一段內存,至關於從HeapAlloc從GetProcessHeap中申請內存。
虛擬地址內存接口: VirtualXXX
VirtualAlloc/VirtualFree/ VirtualProtect/VirtualQuery:從進程堆中申請頁面內存數據。一般用於申請一段大內存,最少申請一頁。reserves or commits a region of pages。
關於這一塊詳細請參考:http://blog.csdn.net/sharecode/article/details/7464915
malloc,new,VirtualAlloc,HeapAlloc這幾組的執行效率:
參考:http://blog.csdn.net/susubuhui/article/details/7315094
分配大內存的時候 VirtualAlloc才能體現出優點,申請小內存時比較慢。
至於小塊內存那就是HeapAlloc > malloc > new,由於都是調用HeapAlloc,直接使用HeapAlloc要快不少。
擴展的新接口xxxEx(不是全部版本都支持)
以Ex結尾,例如VitualAllocEx,能夠指定process handle,從而從其它運行進程空間申請一段內存。
函數說明:
HeapCreate:
從內存區申請一段內存做爲堆。This function reserves memory from the shared memory area.
HeapDestroy:
刪除HeapCreate建立的堆。This function destroys the specified heap object.
GetProcessHeap:
獲取當前進程的堆Handle。注意這個不能使用Destroy刪除。This function obtains a handle to the heap of the calling process. This handle can then be used in calls to the HeapAlloc,HeapReAlloc,HeapFree, andHeapSize functions.
HeapAlloc:
從指定堆申請一段內存,該段內存是不被移動的。This function allocates a block of memory from a heap. The allocated memory is not movable.
HeapReAlloc:
從指定堆從新申請一段內存。This function reallocates a block of memory from a heap. The allocated memory is not movable.
HeapFree:
釋入HeapAlloc或HeapReAlloc申請的內存。This function frees a memory block from a heap. The memory block was allocated by the HeapAlloc or theHeapReAllocfunction.
HeapSize:
根據Handle、內存開始地址,查詢一段HeapAlloc內存的大小。This function returns the size, in bytes, of a memory block allocated from a heap by the HeapAllocorHeapReAlloc function.
HeapValidate:
檢查Heap Handle或Heap Handle下申請的內存是否有效。
This function validates the specified heap. HeapValidate scans all the memory blocks in the heap and verifies that the heap control structures maintained by the heap manager are in a consistent state. The HeapValidate function can also be used to validate a single memory block within a specified heap without checking the validity of the entire heap.
LocalAlloc/LocalReAlloc/LocalFree/LocalSize:
從當前進程Heap中進行操做。該組函數至關於HeapXXX指定Heap Handle爲當前進程Handle。函數參考HeapAlloc / HeapReAlloc/ HeapFree/ HeapSize做用。
LocalAlloc : This function allocates the specified number of bytes from the heap.
In the linear Windows Embedded CE API environment, there is no difference between the local heap and the global heap.LocalAlloc is equivalent toHeapAlloc(GetProcessHeap, …).
VirtualAlloc/VirtualFree/ VirtualProtect/VirtualQuery:
從當前進程空間中申請頁面空間數據,最少申請一頁。
The VirtualAlloc function reserves or commits a region of pages in the virtual address space of the calling process. Memory allocated by this function is automatically initialized to zero, unless MEM_RESET is specified.
To allocate memory in the address space of another process, use theVirtualAllocEx function.
來源:http://www.cnblogs.com/Madridspark/p/5778433.html
VirtualAlloc
該函數的功能是在調用進程的虛地址空間,預約或者提交一部分頁,若是用於內存分配的話,而且分配類型未指定MEM_RESET,則系統將自動設置爲0
一次分配 1PAGE 以上的 RAM. 每次分配都是 PAGE 的整數倍. 你不會想爲了分配 1 個 BYTE 的空間而浪費剩下的 4095 字節. OK, 你能夠本身寫算法, 多分配幾 PAGE. 而後每次分配少許數據時就從那幾 PAGE 中劃分出來. KERNEL32 提供了一個解決辦法, 用 HeapAlloc/GlobalAlloc 分配 RAM. 這樣, KERNEL32 幫助完成分配動做, 而且儘可能在減小用於跟蹤空閒區域和已佔用區域消耗的數據結構.
GlobalAlloc 和 LocalAlloc
從全局堆中分配出內存供程序使用
都是 Windows 系統提供的內存分配函數, 他們的區別在於 16BIT 代碼時代, 那時沒有不一樣的進程內存空間, GlobalAlloc 是在全局的, 公用的遠堆上分配; LocalAlloc 則在任務本身的近堆上分配. 在 Win32 平臺下這兩個函數是徹底相同的, 都是在進程本身的內存空間中分配, Lock 以後的結果是普通指針(32位近指針).
HeapAlloc
從堆上分配一塊內存,且分配的內存是不可移動的(即若是沒有連續的空間能知足分配的大小,程序不能將其餘零散的空間利用起來,從而致使分配失敗),該分配方法是從一指定地址開始分配,而不像GloabalAlloc是從全局堆上分配,這個有多是全局,也有多是局部。
HeapCreate 就已經完成了建立堆的操做. HeapAlloc, HeapReAlloc 和 HeapFree 都是從這個堆中分配, 釋放內存的函數. 也就是說, Windows 系統其實已經爲咱們提供了完整的一套使用本身的局部堆的操做, 不過沒有看到指定分配策略的方法. 根據編譯器提供的源代碼來 看, VC 中的 malloc, realloc 和 free 等函數主要功能就是用這幾個 API 函數來實現的, 而 BC 中的實現至關複雜, 彷佛是維護了一套本身的邏輯. 聽說 BC 的內存分配比 VC 快, 大概是這個緣由.
好久之前也有個產品叫作 WINDOWS. 那時候的 WINDOWS 是 16BIT 的, 地址空間有些緊俏, 有錢不夠, 還須要糧票肉票才能拿到. 你已經調用 GlobalAlloc 和已經出錢的性質同樣. GlobalAlloc 還不夠, 有時候須要 GlocalLock 才能肯定你的東西確實能夠拿到手, 否則你的指針會非法, 被充公, 你的應用會被殺頭. 扯遠了. 後來 OS 進化了, 以爲能夠取消糧票肉票, 可是你必須用新版鈔票才行. 那就是 HeapAlloc. 只要市場上的 RAM 數量沒問題, 你的 HeapAlloc 沒問題, 那就總能拿到東西. 可是, 你總不能說有了 2000 版的鈔票, 那 80 版的立刻做廢啊, 那 GlobalAlloc 也只好繼續流通下去. 至於能夠流通到何時, 沒人知道. // 這比喻至關經典啊!!!
new 與它們的區別未免太大, 由於與 C++ 的構造函數和異常機制有關. 通常編譯器中的 new 都是用 malloc 來分配內存的. 用 malloc 與其它兩個函數比較應該更合理. 通常 malloc 的實現並非從系統的堆中分配的, 而是從編譯器鏈接的運行庫本身管理的堆中, 在 Win32 平臺上的開發工具的編譯結果中, 一般是用 HeapCreate 建立一個堆, 用 HeapAlloc 和 HeapRealloc 維護堆的空間增加, 在最後用 HeapDestroy 刪除堆. 而在用 malloc 分配, 用 free 釋放時則由運行庫的代碼負責從這個堆中分配空間和向這個堆中歸還空間, 並維護這個堆中的數據結構. 因爲 malloc 堆的管理是由運行庫本身管理的, 所在當咱們使用靜態運行庫時, 若是在一個 DLL 中用 malloc 分配了內存而在另外一個 DLL 中用 free 去釋放它, 一般都會產生問題. 這是由於每一個DLL都鏈接了一份運行庫的代碼, 從而也都有一個本身的局部堆, 而在用 free 釋放時它會假設這塊內存是在本身的堆中分配的, 從而致使錯誤. 而經過 GlobalAlloc 和 LocalAlloc 分配的內存不存在這個問題.
HeapAlloc、VirtualAlloc、GlobalAlloc和LocalAlloc
來源:http://blog.chinaunix.net/uid-26111972-id-2239571.html
1. HeapAlloc: