何时应该在WIN32 API编程中使用“内存操作机制”?

时间:2019-05-06 22:57:07

标签: winapi memory-management heap-memory virtual-memory file-mapping

我正在研究WINAPI编程,并通过编写winapi代码进行了一些实验。当我转向“使用winapi进行内存管理”主题时,我看到有一些“内存操作机制”是

    Virtual Memory 
    >        LPVOID VirtualAlloc(
             LPVOID lpAddress, 
             SIZE_T dwSize, 
             DWORD  flAllocationType,
             DWORD  flProtect);

    Memory Mapped Files
    >        HANDLE CreateFileMappingA(
             HANDLE                hFile,
             LPSECURITY_ATTRIBUTES lpFileMappingAttributes,
             DWORD                 flProtect,
             DWORD                 dwMaximumSizeHigh,
             DWORD                 dwMaximumSizeLow,
             LPCSTR                lpName
             );

    Heaps
    >        HANDLE HeapCreate(
             DWORD  flOptions,
             SIZE_T dwInitialSize,
             SIZE_T dwMaximumSize
             );


但是我无法理解,何时对内存映射文件使用虚拟内存以及何时对内存映射文件使用Heaps机制。使用任何一种实时示例是什么,还是从程序员的角度来看,在哪种情况下我必须更喜欢虚拟内存,映射文件,堆?。

1 个答案:

答案 0 :(得分:0)

应用程序通常使用两个级别的内存分配。操作系统将内存分配给页面中的进程。

由于应用程序通常分配的内存量远小于页面,因此它们使用库函数(例如malloc)从堆管理器分配内存。堆管理器反过来在操作系统的页面中分配内存。

您有两组功能的示例。 VirtualAlloc和CreateFileMapping从操作系统分配内存页面。虚拟内存系统要求将页面备份到辅助存储中。 CreateFileMapping将页面备份到您指定的文件。 VirtualAlloc将导致页面由系统页面文件支持。

通常,当需要分配大量内存(例如用于分子建模的100MB数组)时,可以使用页面分配功能。

HeapCreate用于创建用于较小内存分配的堆。 HeapAlloc可用于从堆中分配内存。更常见的是,C程序员只使用malloc / free。但是,Windoze允许您定义自己的堆以进行更好的控制。在Eunuchs地区,您通常会链接自己的malloc / free实现以执行相同的操作。

因此,您的第一选择是编程语言使用的内存分配方案(例如new / delete,malloc / free)。 您的第二选择是Heap API函数(如果以前的API不能满足您的需求)。 您的第三选择是页面分配功能。