winapi - 什么时候应该在 WIN32 API 编程中使用“内存操作机制”?
问题描述
我正在学习 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
);
但我无法理解,何时使用虚拟内存以及何时使用堆机制类似地用于内存映射文件。使用其中任何一个的实时示例是什么,或者从程序员的角度来看,在哪种情况下我必须更喜欢虚拟内存、映射文件、堆?
解决方案
应用程序通常使用两个级别的内存分配。操作系统以页为单位为进程分配内存。
因为应用程序分配的内存量通常比页面小得多,所以它们使用库函数(例如 malloc)从堆管理器分配内存。堆管理器依次从操作系统的页面中分配内存。
您有两组函数的示例。VirtualAlloc 和 CreateFileMapping 从操作系统分配内存页。虚拟内存系统需要在辅助存储中备份页面。CreateFileMapping 将页面备份到您指定的文件。VirtualAlloc 将导致页面由系统页面文件支持。
一般在需要分配大量内存时使用页分配函数,例如用于分子建模的 100MB 数组。
HeapCreate 用于为较小的内存分配创建堆。HeapAlloc 可用于从堆中分配内存。更常见的是,C 程序员只使用 malloc/free。但是,Windoze 允许您定义自己的堆以便更好地控制。在 Eunuchs 领域,您通常会链接到自己的 malloc/free 实现来做同样的事情。
因此,您的首选是编程语言使用的内存分配方案(例如,new/delete、malloc/free)。您的第二选择是 Heap API 函数(如果前面的不符合您的需要)。您的第三个选择是页面分配函数。
推荐阅读
- mysql - Mysql根据不同的行更新表中的行值
- angular - 离子模式 - onshow 事件?(角度)
- windows - 当 XAMPP 不在分区的根目录中时,为什么它不能工作?
- parsing - 一个属性可以同时合成和继承吗?
- security - 服务器如何验证 JWT?公钥从哪里来?
- google-cloud-platform - GCP 的 Cloud Run 可以用于非 HTTP 服务吗?
- javascript - 用本地存储内容填充 textarea
- ruby-on-rails - 如何将 Ruby gem 加载到模块中
- android - 如何用bottomNavigationView或android底部appbar中的文本替换所选项目图标
- javascript - 如何限制div标签内的元素