博客-GlobalAlloc的GMEM_FIXED和GMEM_MOVABLE使用
**全球分配器GlobalAlloc在Windows API中的应用** 在Windows编程中,内存管理是一个至关重要的环节。`GlobalAlloc`函数是Windows API提供的一种全局内存分配机制,它允许应用程序在进程的虚拟地址空间中分配内存。本博客将深入探讨`GMEM_FIXED`和`GMEM_MOVABLE`两个标志在`GlobalAlloc`中的作用和差异,以及它们如何影响内存分配。 **1. GlobalAlloc函数介绍** `GlobalAlloc`函数的基本语法如下: ```c HGLOBAL GlobalAlloc(UINT uFlags, DWORD dwBytes); ``` 其中,`uFlags`参数用于指定分配类型和内存特性,`dwBytes`则是请求分配的字节数。返回值`HGLOBAL`是一个句柄,指向分配的内存块。 **2. GMEM_FIXED与GMEM_MOVABLE** - **GMEM_FIXED**: 这个标志指示`GlobalAlloc`分配固定内存。这意味着一旦内存被分配,其地址将不会改变,即使系统需要重新定位该内存块。固定内存适合于需要直接寻址的场合,例如,存储硬件寄存器映射或数据结构的指针。使用`GMEM_FIXED`时,内存块不能被移动,因此可能无法充分利用系统资源进行内存优化。 - **GMEM_MOVABLE**: 相反,`GMEM_MOVABLE`标志允许Windows在需要时移动内存块,以便进行内存管理和优化。这种类型的内存适合于不依赖特定内存地址的情况。当内存被移动时,所有指向该内存的指针都需要更新,Windows会自动处理这个问题。`GMEM_MOVABLE`可以使用内存碎片整理,提高系统效率。 **3. 测试文件VC6_CONSOLE_GlobalAlloc** 提供的测试文件`VC6_CONSOLE_GlobalAlloc`很可能是一个基于Visual C++ 6.0编写的控制台应用程序,用于演示`GlobalAlloc`在不同标志下的行为。通过创建和分配内存块,然后分别使用`GMEM_FIXED`和`GMEM_MOVABLE`进行操作,程序可能展示了如何分配、使用和释放这些内存,以及不同标志下内存处理的差异。 **4. 使用示例** 以下是一个简单的示例,展示了如何使用`GMEM_FIXED`和`GMEM_MOVABLE`: ```c #include <windows.h> #include <stdio.h> int main() { // 分配固定内存 HGLOBAL hFixedMem = GlobalAlloc(GMEM_FIXED, 1024); if (hFixedMem) { printf("Fixed memory allocated at: %p\n", hFixedMem); GlobalFree(hFixedMem); } else { printf("Failed to allocate fixed memory.\n"); } // 分配可移动内存 HGLOBAL hMoveableMem = GlobalAlloc(GMEM_MOVABLE, 1024); if (hMoveableMem) { printf("Moveable memory allocated at: %p\n", hMoveableMem); GlobalFree(hMoveableMem); } else { printf("Failed to allocate moveable memory.\n"); } return 0; } ``` **5. 结论** 理解`GMEM_FIXED`和`GMEM_MOVABLE`的区别对于编写高效、可靠的Windows应用程序至关重要。`GMEM_FIXED`提供了稳定的内存地址,但牺牲了部分灵活性;而`GMEM_MOVABLE`允许系统优化内存布局,但需要考虑指针更新的问题。根据具体应用场景选择合适的标志,能够更好地利用系统资源,避免潜在的内存问题。在实际编程中,通常需要根据需求权衡这两种选项的优缺点。
- 1
- u0115478732015-05-25可以看看,讲的比较全面
- TAOo02016-05-06感觉没什么用处
- kernel0112017-10-09东西不错,支持一下。
- 剑吼西风5202016-08-26可以参考,里面讲解的范围比较广
- Intel00112017-05-10good resource, thx
- 粉丝: 1227
- 资源: 109
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
最新资源
- 联想7400打印机更换定影组件.jpg
- 基于servlet+jsp+mysql实现的影视管理系统课程设计
- GUIdemo.zip
- 正点原子RK3568卡片电脑ATOMPI-CA1的ubuntu-24.04.1最小安装包,特别适合运行板级ROS2环境jazzy
- U盘量产工具SM3280&3281&3282-AvidiaV0209整合版
- 可直接运行 MATLAB数学建模学习资料 模拟算法MATLAB代码实现.rar
- 计算机数学建模中模拟退火算法详解及其TSP问题求解应用
- 基于 Java+SQLServer 实现的医药售卖系统课程设计
- HCNP(HCDP)华为认证资深网络工程师-路由交换方向培训 -IESN中文理论书-内文.pdf
- 新版FPGA课程大纲,芯片硬件开发用的大纲