You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.14 08:01:30