WIN32API编程什么时候用"Memory Manipulation Mechanisms"?

when should I use "Memory Manipulation Mechanisms" in WIN32 API programming?

我正在研究 WINAPI 编程并通过编写 winapi 代码做一些实验。当我转向 'Memory Management using winapi' 主题时,我看到有一些 'Memory Manipulation Mechanisms' 是

    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
             );


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

应用程序通常使用两级内存分配。操作系统以页为单位为进程分配内存。

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

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

通常,当您需要分配大量内存时,例如用于分子建模的 100MB 数组,您会使用页面分配函数。

HeapCreate 用于为较小的内存分配创建堆。 HeapAlloc 可用于从堆中分配内存。更常见的是,C 程序员只使用 malloc/free。但是,Windoze 允许您定义自己的堆以便更好地控制。在 Eunuchs 土地上,您通常 link 在自己的 malloc/free 实现中做同样的事情。

因此,您的首选是编程语言使用的内存分配方案(例如,new/delete、malloc/free)。 你的第二个选择是HeapAPI functions(如果前一个不能满足你的需要)。 您的第三个选择是页面分配函数。