GlobalMemoryStatusEx是Windows推荐的获取物理内存信息的API,需初始化MEMORYSTATUSEX结构体的dwLength字段为sizeof(MEMORYSTATUSEX),成功时返回ullTotalPhys和ullAvailPhys(字节),兼容Windows XP SP2及以上系统。

Windows 下用 GlobalMemoryStatusEx 获取物理内存信息
Windows 提供了 GlobalMemoryStatusEx 这个稳定且兼容性好的 API,能准确返回总物理内存(ullTotalPhys)和当前可用物理内存(ullAvailPhys),单位是字节。它从 Windows XP SP2 开始就支持,现代项目基本可无条件使用。
关键点:必须传入已初始化的 MEMORYSTATUSEX 结构体,且 dwLength 字段要设为 sizeof(MEMORYSTATUSEX),否则函数直接返回 FALSE —— 这是新手最常踩的坑。
示例片段:
MEMORYSTATUSEX memInfo;
memInfo.dwLength = sizeof(MEMORYSTATUSEX);
if (GlobalMemoryStatusEx(&memInfo)) {
uint64_t total = memInfo.ullTotalPhys; // 总物理内存字节数
uint64_t avail = memInfo.ullAvailPhys; // 当前可用物理内存字节数
}Linux/macOS 用 sysconf 获取 _SC_PHYS_PAGES 和 _SC_AVPHYS_PAGES
POSIX 系统下,sysconf 是最轻量、无需额外权限的方案。_SC_PHYS_PAGES 返回总物理页数,_SC_AVPHYS_PAGES 返回当前可用物理页数,需乘以 sysconf(_SC_PAGESIZE) 才能得到字节数。
立即学习“C++免费学习笔记(深入)”;
注意两个易错细节:
-
sysconf返回-1表示不支持或出错(比如某些容器环境禁用了该接口),不能直接当数值用 - macOS 的
_SC_AVPHYS_PAGES实际返回的是「可用用户态物理页」,不含内核保留页,数值通常比 Linux 下略小,但对应用层监控已足够可靠
示例片段:
long pagesize = sysconf(_SC_PAGESIZE);
long total_pages = sysconf(_SC_PHYS_PAGES);
long avail_pages = sysconf(_SC_AVPHYS_PAGES);
if (pagesize > 0 && total_pages > 0 && avail_pages > 0) {
uint64_t total = static_cast<uint64_t>(total_pages) * pagesize;
uint64_t avail = static_cast<uint64_t>(avail_pages) * pagesize;
}跨平台封装时如何避免宏污染与编译分支混乱
不要在头文件里写 #ifdef _WIN32 套一大段实现;把平台逻辑收进 cpp 文件,头文件只暴露统一接口,比如 get_physical_memory_total() 和 get_physical_memory_available(),返回 std::optional<uint64_t> 表示可能失败。
更关键的是:Linux/macOS 下 sysconf 调用开销极低,但 Windows 的 GlobalMemoryStatusEx 是内核调用,虽快但不宜高频轮询(例如每毫秒调一次)。实际业务中,若用于状态面板刷新,建议间隔 ≥500ms。
另外,某些嵌入式 Linux 或容器环境(如 Docker 默认配置)会限制 /proc/meminfo 访问,此时 sysconf 仍可用,而基于文件解析的方案会静默失败——这也是坚持用系统 API 而非读文件的根本原因。
为什么不该解析 /proc/meminfo 或 hostinfo
虽然 /proc/meminfo 看似直观,但字段语义模糊:MemTotal 包含预留给硬件/固件的内存,MemAvailable 是内核 3.14+ 引入的估算值(考虑 page cache 可回收部分),并非严格意义上的“当前可用物理页”。直接解析它会导致跨内核版本行为不一致。
macOS 的 hostinfo 命令输出不稳定(不同版本字段顺序/名称有变),且依赖 shell 调用,无法静态链接,也不适合嵌入式或沙箱环境。
真正需要高精度的场景(比如内存泄漏压测),应以 GlobalMemoryStatusEx 和 sysconf 为准;它们返回的是内核维护的实时计数器,不经过估算或策略干预。



















