头文件
memoryinfo.h(头文件):
#ifndef MEMORYINFO_H
#define MEMORYINFO_H
struct MemoryInfo {
unsigned long long totalPhysicalMemory; // 总物理内存大小(字节)
unsigned long long availablePhysicalMemory; // 可用物理内存大小(字节)
unsigned long long totalVirtualMemory; // 总虚拟内存大小(字节)
unsigned long long availableVirtualMemory; // 可用虚拟内存大小(字节)
};
class MemoryInfoGetter {
public:
MemoryInfo getMemoryInfo();
};
#endif // MEMORYINFO_H
源文件
memoryinfo.cpp(源文件):
#include "memoryinfo.h"
#ifdef _WIN32//检查当前编译环境是否是 Windows 系统
#include <windows.h>
#include <psapi.h>
#pragma comment(lib, "psapi.lib")
#else//如果当前编译环境不是 Windows 系统,则包含<sys/sysinfo.h>,
//它提供了在类 Unix 系统上获取系统和内存信息的函数和数据类型的定义。
#include <sys/sysinfo.h>
#endif
MemoryInfo MemoryInfoGetter::getMemoryInfo() {
MemoryInfo memoryInfo;
#ifdef _WIN32
MEMORYSTATUSEX status;//存储内存信息的结构体
status.dwLength = sizeof(status);//先初始化结构体的长度
GlobalMemoryStatusEx(&status);//调用此函数将内存信息存储到status中
memoryInfo.totalPhysicalMemory = status.ullTotalPhys;
memoryInfo.availablePhysicalMemory = status.ullAvailPhys;
memoryInfo.totalVirtualMemory = status.ullTotalVirtual;
memoryInfo.availableVirtualMemory = status.ullAvailVirtual;
#else
struct sysinfo info;
sysinfo(&info);
memoryInfo.totalPhysicalMemory = info.totalram * info.mem_unit;
memoryInfo.availablePhysicalMemory = info.freeram * info.mem_unit;
memoryInfo.totalVirtualMemory = info.totalram * info.mem_unit;
memoryInfo.availableVirtualMemory = info.freeram * info.mem_unit;
#endif
return memoryInfo;
}
实现关键:
MEMORYSTATUSEX
结构体,包含有关物理内存和虚拟内存(包括扩展内存)的当前状态的信息。 GlobalMemoryStatusEx 函数在此结构中存储信息。
语法:
typedef struct _MEMORYSTATUSEX {
DWORD dwLength;
DWORD dwMemoryLoad;
DWORDLONG ullTotalPhys;
DWORDLONG ullAvailPhys;
DWORDLONG ullTotalPageFile;
DWORDLONG ullAvailPageFile;
DWORDLONG ullTotalVirtual;
DWORDLONG ullAvailVirtual;
DWORDLONG ullAvailExtendedVirtual;
} MEMORYSTATUSEX, *LPMEMORYSTATUSEX;
成员说明
dwLength
结构大小(以字节为单位)。 在调用之前,必须设置此成员
GlobalMemoryStatusEx
.
dwMemoryLoad
一个介于 0 和 100 之间的数字,指定正在使用的物理内存的近似百分比 (0 表示不使用内存,100 表示) 已满内存使用。
ullTotalPhys
实际物理内存量(以字节为单位)。
ullAvailPhys
当前可用的物理内存量(以字节为单位)。 这是可以立即重复使用的物理内存量,而无需先将其内容写入磁盘。 它是备用列表、可用列表和零列表的大小之和。
ullTotalPageFile
系统或当前进程的当前已提交内存限制,以字节为单位,以较小者为准。 若要获取系统范围的已提交内存限制,请调用 GetPerformanceInfo
。
ullAvailPageFile
当前进程可以提交的最大内存量(以字节为单位)。 此值等于或小于系统范围的可用提交值。 若要计算系统范围的可用提交值,请调用 GetPerformanceInfo,并从 CommitLimit 的值中减去 CommitTotal 的值。
ullTotalVirtual
调用进程的虚拟地址空间的用户模式部分的大小(以字节为单位)。 此值取决于进程类型、处理器类型和操作系统的配置。 例如,对于 x86 处理器上的大多数 32 位进程,此值约为 2 GB,对于在启用了 4 GB 优化 的系统上运行的大地址感知的 32 位进程,此值约为 3 GB。
ullAvailVirtual
当前位于调用进程的虚拟地址空间的用户模式部分中的未保留和未提交的内存量(以字节为单位)。
ullAvailExtendedVirtual
保留。 此值始终为 0。