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;
}