全局和本地功能

【勇芳软件工作室】汉化HomePreviousNext

一个进程可以使用GlobalAllocLocalAlloc函数来分配内存。在Win32 API的线性32位环境中,不区分本地堆和全局堆。结果,这些功能分配的内存对象没有区别。

GlobalAllocLocalAlloc分配的内存对象位于具有读写访问权限的私有,已提交的页面中。【私人记忆】无法被其他进程访问。通过使用GlobalAlloc与GMEM_DDESHARE标志分配的内存实际上并不像在Windows版本3中一样全局共享。【x】.但是,该标志可用于兼容性目的,并且可被某些应用程序用于增强动态数据交换(DDE)操作的性能。需要共享内存用于其他目的的应用程序必须使用文件映射对象。多个进程可以映射相同文件映射对象的视图,以提供命名的共享内存。有关文件映射的更多信息,请参阅文件映射共享内存.

通过使用GlobalAllocLocalAlloc,您可以分配一个可以由32位表示的大小的内存块。您只受可用的物理内存限制,包括磁盘上的页面文件中的存储。这些功能以及操纵全局和本地内存对象的其他全局和本地函数都包含在Win32 API中,以与16位版本的Windows兼容。然而,从16位分段存储器模型到32位虚拟内存模型的改变使得某些功能和选项不必要或无意义。例如,不再有近和远的指针,因为本地和全局分配返回32位虚拟地址。

GlobalAllocLocalAlloc都可以分配固定或可移动的内存对象。可移动物体也可以标记为可废弃物。在早期版本的Windows中,可移动内存对象对于内存管理非常重要。它们使系统能够在需要时对堆进行压缩,以便为其他内存分配提供空间。通过使用虚拟内存,系统能够通过移动物理内存的页面来管理内存,而不会影响使用页面的进程的虚拟地址。当系统移动物理内存页面时,它只需将进程的虚拟页面映射到物理页面的新位置。移动内存对于分配可丢弃的内存仍然是有用的。当系统需要额外的物理存储时,它可以使用“最近最少使用的”算法来释放未锁定的可丢弃的内存。应该对不需要的数据使用可丢弃的内存,并且可以轻松重新生成数据。

当分配固定的内存对象时,GlobalAllocLocalAlloc返回一个32位指针,调用进程可以立即使用它来访问内存。对于可移动内存,返回值是一个句柄。要获取指向可移动内存对象的指针,调用进程使用GlobalLockLocalLock函数。这些功能锁定内存,使其不能移动或丢弃。每个存储器对象的内部数据结构包括最初为零的锁定计数。对于可移动存储器对象,GlobalLockLocalLock将计数递增1,并且GlobalUnlockLocalUnlock函数将计数递减1。锁定的存储器不被移动或丢弃,除非通过使用GlobalReAllocLocalReAlloc功能重新分配存储器对象。锁定的存储器对象的存储块保持锁定在存储器中,直到其锁定计数减小到零为止,此时可以移动或丢弃它。

GlobalAllocLocalAlloc分配的内存的实际大小可能大于请求的大小。要确定分配的实际字节数,请使用GlobalSizeLocalSize功能。如果分配的金额大于所要求的金额,则该过程可以使用整个金额。

GlobalReAllocLocalReAlloc功能可以更改GlobalAllocLocalAlloc分配的内存对象的大小(以字节为单位)或属性。尺寸可以增减。

GlobalFreeLocalFree功能释放由GlobalAlloc LocalAllocGlobalReAllocLocalReAlloc分配的内存。

其他全球和本地功能包括GlobalDiscardLocalDiscardGlobalFlagsLocalFlagsGlobalHandleLocalHandle功能。要放弃指定的可丢弃的内存对象而不使句柄无效,请使用GlobalDiscardLocalDiscard.稍后可以使用句柄GlobalReAllocLocalReAlloc来分配与相同句柄相关联的新内存块。要返回有关指定内存对象的信息,请使用GlobalFlagsLocalFlags.该信息包括对象的锁定计数,并指示对象是否可丢弃或已被丢弃。要返回与指定指针相关联的内存对象的句柄,请使用GlobalHandleLocalHandle.