Visual C++如何获取总内存?Windows Form加载时结果异常排查
为什么GlobalMemoryStatusEx返回的总内存比实际少?
先拆解GlobalMemoryStatusEx的工作原理
这个Windows API是用来获取应用程序可访问的系统内存状态的,核心逻辑很直观:
- 你必须先给
MEMORYSTATUSEX结构体的dwLength字段赋值为结构体的大小,这是API的「版本校验」步骤——确保系统能正确识别你使用的结构体版本,避免新旧系统的兼容性问题。 - 调用
GlobalMemoryStatusEx(&statex)后,结构体里的字段会被填充:ullTotalPhys:返回的是当前系统能分配给应用程序的物理内存总量——划重点,这不是BIOS识别的「总安装内存」。- 其他字段比如
ullAvailPhys是剩余可用物理内存,ullTotalVirtual是总虚拟内存等。
为什么32GB内存只显示23GB?
答案很明确:一部分物理内存被硬件和系统预留了,不会被GlobalMemoryStatusEx统计到。常见的预留场景包括:
- 集成显卡共享显存:如果你的电脑用的是集成显卡(比如Intel UHD/NVIDIA MX系列),它会直接从物理内存里划走一部分当显存用——从你的数值来看,大概9GB左右被显卡占用了(32-23=9),这部分内存对应用程序来说完全不可见。
- 硬件设备预留:除了显卡,网卡、声卡、存储控制器等硬件也会预留少量内存用于自身的操作。
- 系统内核预留:Windows系统本身会预留一小部分内存给内核组件、硬件抽象层(HAL)使用,这部分也不会计入
ullTotalPhys。
如何获取实际安装的32GB总内存?
如果想得到BIOS识别的物理安装总内存,应该用GetPhysicallyInstalledSystemMemory这个API,它专门用来返回硬件层面的总内存大小(单位是MB)。给你写个可以直接在WinForm里用的示例代码:
#include <windows.h> void GetTotalInstalledRAM() { DWORDLONG totalMemMB = 0; // 调用API获取总安装内存(单位MB) if (GetPhysicallyInstalledSystemMemory(&totalMemMB)) { unsigned long long RAM_GB = totalMemMB / 1024; // 这里可以把RAM_GB赋值给WinForm的控件显示 // 比如 label1->Text = std::to_string(RAM_GB) + "GB"; } else { // 如果获取失败,可以用GetLastError()查看错误码 DWORD errorCode = GetLastError(); } } // 在Form1的Load事件中调用这个函数即可
最后补个小知识点
- 如果你的场景是监测应用程序可用内存(比如做内存优化、资源调度),那
GlobalMemoryStatusEx的ullTotalPhys和ullAvailPhys是有用的; - 但如果是要显示给用户「你的电脑装了多少内存」,一定要用
GetPhysicallyInstalledSystemMemory,它的数值和你在系统属性里看到的完全一致。
内容的提问来源于stack exchange,提问作者Perotto
相关产品推荐
相关产品推荐

