- 虚拟内存 :最适合用来管理大型对象数组或大型结构数组。
- 内存映射文件 :最适合用来管理大型数据流(通常是文件),以及在同一机器上运行的多个进程之间共享数据。
- 堆 :最适合用来管理大量的小型对象。
以下将讨论第一种方式,即虚拟内存。
1.预定地址空间区域
我们可以调用VirtualAlloc函数来预订进程中的地址空间区域:
PVOID VirtualAlloc(
PVOID pvAddress,
SIZE_T dwSize,
DWORD fdwAllocationType,
DWORD fdwProtect);
第一个参数 pvAddress , 是内存地址,用来告诉系统我们想要预定地址空间中的哪一块。由于系统会记录所有闲置的地址区间,因此大多数时候我们只要给该参数传NULL就可以了。这等于是告诉系统自动找一块闲置区域。记住:这里的内存地址指的是进程的地址空间中的用户模式地址空间。
第二个参数 dwSize 用来指定我们想要预定的区域大小,以字节为单位。系统始终都根据CPU页面大小的整数倍来预订区域,如我们预定5KB的空间,那么最终得到的会是8KB(两个页面2*4KB)。
第三个参数 fdwAllocationType ,用来告诉系统是要预定区域还是要调拨物理存储器(因为调拨物理存储器也是用的VirtualAlloc函数,MEM_RESERVE:预定地址空间区域,MEM_COMMIT:调拨物理存储器,MEM_TOP_DOWN:指定从尽可能高的内存地址来预订区域)。
第四个参数 fdwProtect 是给区域指定的保护属性。区域的保护属性对调拨给该区域的物理存储器不起任何作用。无论为区域指定什么保护属性,只要还没有给它调拨物理存储器,试图访问区域内的任何内存地址都会引发访问违规。
当区域的保护属性和将要调拨的物理存储器的保护属性相一致时,系统内部的处理效率会更高。
|
---|