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: