我正在研究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机制。使用任何一种实时示例是什么,还是从程序员的角度来看,在哪种情况下我必须更喜欢虚拟内存,映射文件,堆?。
答案 0 :(得分:0)
应用程序通常使用两个级别的内存分配。操作系统将内存分配给页面中的进程。
由于应用程序通常分配的内存量远小于页面,因此它们使用库函数(例如malloc)从堆管理器分配内存。堆管理器反过来在操作系统的页面中分配内存。
您有两组功能的示例。 VirtualAlloc和CreateFileMapping从操作系统分配内存页面。虚拟内存系统要求将页面备份到辅助存储中。 CreateFileMapping将页面备份到您指定的文件。 VirtualAlloc将导致页面由系统页面文件支持。
通常,当需要分配大量内存(例如用于分子建模的100MB数组)时,可以使用页面分配功能。
HeapCreate用于创建用于较小内存分配的堆。 HeapAlloc可用于从堆中分配内存。更常见的是,C程序员只使用malloc / free。但是,Windoze允许您定义自己的堆以进行更好的控制。在Eunuchs地区,您通常会链接自己的malloc / free实现以执行相同的操作。
因此,您的第一选择是编程语言使用的内存分配方案(例如new / delete,malloc / free)。 您的第二选择是Heap API函数(如果以前的API不能满足您的需求)。 您的第三选择是页面分配功能。