-1

我正在学习 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
             );


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

4

1 回答 1

0

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

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

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

一般在需要分配大量内存时使用页分配函数,例如用于分子建模的 100MB 数组。

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

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

于 2019-05-07T17:29:20.380 回答