当前位置:C++技术网 > 精选 > C++获取系统当前的内存使用情况信息代码实现

C++获取系统当前的内存使用情况信息代码实现

更新时间:2016-11-08 17:14:40浏览次数:1+次

    首先来看看实现的效果:

单条内存条内存的情况

【单条内存条内存的情况】

所有内存条内存的情况

【所有内存条内存的情况】

   其实获取这些信息,非常简单,和Hello World一样简单。不信,就来看看。

    获取单条内存条的内存情况的API函数为:GlobalMemoryStatus

    获取所有内存条的内存的情况的API函数为:GlobalMemoryStatusEx

    后者是前者的增强版。最早只有GlobalMemoryStatus函数,因为那时候内存很贵,而且都是一个内存条,这个函数就可以很好的满足了。后来内存越来越大,然后出现了多条内存条的情况,所以出现了GlobalMemoryStatusEx。如果你用GlobalMemoryStatus去获取所有内存情况,那是不对的。这一点需要说明清楚,以免浪费时间想这个问题。

    GlobalMemoryStatus函数接受信息的结构体为MEMORYSTATUS,GlobalMemoryStatusEx函数接受信息的结构体为MEMORYSTATUSEX。这两个函数只有一个参数,就是他们对应的结构体变量地址。然后你就可以在结构体变量读取获取到的各种信息,也就是图中看到的这些信息。非常简单。

    不过需要注意的是,MEMORYSTATUSEX在使用前,需要设置一下结构体大小成员,代码如下:

MEMORYSTATUSEX status;
status.dwLength = sizeof(MEMORYSTATUSEX);//不能漏掉了,否则获取不到正确的数据
   获取内存信息的代码为:


//单内存条
MEMORYSTATUS status;
GlobalMemoryStatus(&status);
//多内存条
MEMORYSTATUSEX status;
status.dwLength = sizeof(MEMORYSTATUSEX);//不能漏掉了,否则获取不到正确的数据
GlobalMemoryStatusEx(&status);
    信息都在结构体变量里,我们看看结构体的声明:


typedef struct _MEMORYSTATUS {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    SIZE_T dwTotalPhys;
    SIZE_T dwAvailPhys;
    SIZE_T dwTotalPageFile;
    SIZE_T dwAvailPageFile;
    SIZE_T dwTotalVirtual;
    SIZE_T dwAvailVirtual;
} MEMORYSTATUS, *LPMEMORYSTATUS;
typedef struct _MEMORYSTATUSEX {
    DWORD dwLength;
    DWORD dwMemoryLoad;
    DWORDLONG ullTotalPhys;
    DWORDLONG ullAvailPhys;
    DWORDLONG ullTotalPageFile;
    DWORDLONG ullAvailPageFile;
    DWORDLONG ullTotalVirtual;
    DWORDLONG ullAvailVirtual;
    DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
    两个结构体的声明也差不多,就是数据类型和成员的名称有点不一样,EX版本多了一个成员。各个成员的含义,见下面的格式化信息代码:


    CString str;
    str.Format(_T("【单条内存条】内存使用比例:%d%%\n总物理内存:%.2f GB - 可用物理内存:%.2f GB\n总虚拟内存:%.2f GB - 可用虚拟内存:%.2f GB\n总页文件:  %.2f GB - 可用页文件:  %.2f GB"),
        status.dwMemoryLoad,status.dwTotalPhys/1024.0/1024.0/1024.0,status.dwAvailPhys/1024.0/1024.0/1024.0,status.dwTotalVirtual/1024.0/1024.0/1024.0,status.dwAvailVirtual/1024.0/1024.0/1024.0,status.dwTotalPageFile/1024.0/1024.0/1024.0,status.dwAvailPageFile/1024.0/1024.0/1024.0);
CString str;
str.Format(_T("【所有内存条】内存使用比例:%d%%\n总物理内存:%.2f GB - 可用物理内存:%.2f GB\n总虚拟内存:%.2f GB - 可用虚拟内存:%.2f GB\n总页文件:  %.2f GB - 可用页文件:  %.2f GB\n可用扩展虚拟内存:%.2f"),
    status.dwMemoryLoad,status.ullTotalPhys/1024.0/1024.0/1024.0,status.ullAvailPhys/1024.0/1024.0/1024.0,status.ullTotalVirtual/1024.0/1024.0/1024.0,status.ullAvailVirtual/1024.0/1024.0/1024.0,status.ullTotalPageFile/1024.0/1024.0/1024.0,status.ullAvailPageFile/1024.0/1024.0/1024.0,status.ullAvailExtendedVirtual/1024.0/1024.0/1024.0);
    自己对应一下,成员名字一看就懂了。