比较内存分配方法
下面简要比较了各种内存分配方法:
- CoTaskMemAlloc
- GlobalAlloc
- HeapAlloc
- LocalAlloc
- malloc
- new
- VirtualAlloc
尽管 GlobalAlloc、 LocalAlloc 和 HeapAlloc 函数最终会从同一堆分配内存,但每个函数提供的功能集略有不同。 例如,如果无法分配内存,则指示 HeapAlloc 引发异常,此功能不适用于 LocalAlloc。 LocalAlloc 支持分配句柄,这些句柄允许在不更改句柄值的情况下通过重新分配移动基础内存, 此功能在 HeapAlloc 中不可用。
从 32 位 Windows 开始, GlobalAlloc 和 LocalAlloc 作为包装函数实现,这些函数使用进程默认堆的句柄调用 HeapAlloc 。 因此, GlobalAlloc 和 LocalAlloc 的开销大于 HeapAlloc。
由于不同的堆分配器使用不同的机制提供独特的功能,因此必须使用正确的函数释放内存。 例如,使用 HeapAlloc 分配的内存必须使用 HeapFree 释放,而不是 LocalFree 或 GlobalFree。 必须使用相应的全局或本地函数查询、验证和释放使用 GlobalAlloc 或 LocalAlloc 分配的内存。
VirtualAlloc 函数允许指定内存分配的其他选项。 但是,其分配使用页面粒度,因此使用 VirtualAlloc 可能会导致更高的内存使用率。
malloc 函数的缺点是依赖于运行时。 new 运算符的缺点是依赖于编译器,依赖于语言。
CoTaskMemAlloc 函数具有在 C、C++ 或 Visual Basic 中正常工作的优点。 这也是在基于 COM 的应用程序中共享内存的唯一方法,因为 MIDL 使用 CoTaskMemAlloc 和 CoTaskMemFree 封送内存。
示例
相关主题