在使用 GlobalAlloc 分配一个全局内存块时,使用GMEM_FIXED分配一个固定内存块与使用GMEM_MOVEABLE分 配一个可移动内存块到底有什么不同?(请 具 体 点)
其效率上是否也存在差异?
为什么在有些源码中,再使用GMEM_MOVEABLE标志分配内存时,将使用GlobalFree对其返回的内存句柄进行释放操作的语句注释掉,或者干脆就不写?难道是不需要这么做吗?

解决方案 »

  1.   

    GMEM_MOVEABLE是允许操作系统(或者应用程序)实施对内存堆的管理,在必要时,操作系统可以移动内存块获取更大的块,或者合并一些空闲的内存块,也称“垃圾回收”,它可以提高内存的利用率。一般情况下,内存堆空间是由用户来管理的,windows操作系统不干预。如果存在下列情况,即堆中有10个1K的空闲块,这时如果直接申请一个5K的内存空间,会得到不成功的信息。但如果其它已经被占用的内存块是movable,这时系统就可以移动这些内存块,合并出一个5k的内存块,并成功分配给用户使用。它的空间效率是以运行时的时间效率为代价的。
      

  2.   

    标 志 意 义—————————————————————————————————gmem_DDEShare 分配可由应用程序共享的内存gmem_Discardable 分配可抛弃的内存(只与gmem_Moveable连用)gmem_Fixed 分配固定内存gmem_Moveable 分配可移动的内存gmem_Nocompact 该全局堆中的内存不能被压缩或抛弃gmem_Nodiscard 该全局堆中的内存不能被抛弃gmem_NOT_Banked 分配不能被分段的内存gmem_Notify 通知功能。当该内存被抛弃时调用GlobalNotify函数gmem_Zeroinit 将所分配内存块的内容初始化为零━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━   有两个预定义的常用组合是:GHND = gmem_Moveable and gmem_ZeroinitGPTK = gmem_Fixed and gmem_Zeroinit  第二个参数用于设置欲分配的字节数。分配的字节数必须是32的倍数,因而实际分配的字节数可能比所设置的要大。  由于用gmem_DDEShare分配的内存在分配内存的模块终止时自动抛弃,因而不必调用GlobalFree显式释放内存。