欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

GlobalMemoryStatus获取内存错误大小不对

程序员文章站 2022-06-03 15:55:16
...

GlobalMemoryStatus可以获取当前系统内存状态。

但是我机器有16G获取出来大小只有4G,到官方函数查看原来要使用获取GlobalMemoryStatusEx。

官方GlobalMemoryStatus函数描述:

https://docs.microsoft.com/zh-cn/windows/desktop/api/winbase/nf-winbase-globalmemorystatus

它说

       “[GlobalMemoryStatus can return incorrect information. Use the GlobalMemoryStatusEx function instead.]
Retrieves information about the system's current usage of both physical and virtual memory.”

翻译一下

        “GlobalMemoryStatus可以返回不正确的信息。而是使用GlobalMemoryStatusEx函数。]检索有关系统当前物理内存和虚拟内存使用情况的信息。”

为什么呢?

我们可看到结构体MEMORYSTATUS内部是unsigned long定义的SIZE_T

而MEMORYSTATUSEX是 unsigned __int64定义的DWORDLONG

并且在数据占用字符上MEMORYSTATUSEX(占64字符)长度是MEMORYSTATUS(占32字符)的两倍

所以MEMORYSTATUSEX可以表示16G大小

GlobalMemoryStatusEx函数用法

//获取内存,返回MB大小
int GetMemory(DWORD& dwTotalPhys, DWORD& dwTotalVirtual)
{
    MEMORYSTATUSEX statex; 
    statex.dwLength = sizeof(statex);
    GlobalMemoryStatusEx(&statex);
    DWORDLONG dwSize = (DWORDLONG)statex.ullTotalPhys / (1024 * 1024);
    DWORDLONG dwVirtSize = (DWORDLONG)statex.ullTotalVirtual / (1024 * 1024);
    dwTotalPhys = dwSize;
    dwTotalVirtual = dwVirtSize;
    return 0;
}