Windows需用GlobalMemoryStatusEx并初始化dwLength,Linux解析/proc/meminfo中MemAvailable,macOS用host_statistics64获取free_count;跨平台应返回带platform_hint的结构体,统一用字节单位并提供转换方法。

Windows下用GlobalMemoryStatusEx获取内存数据
Windows平台必须用GlobalMemoryStatusEx,旧的GlobalMemoryStatus已被弃用,且不支持大于4GB的内存。调用前需包含Windows.h,结构体MEMORYSTATUSEX要提前初始化dwLength字段,否则返回失败。
- 忘记设置
memStat.dwLength = sizeof(MEMORYSTATUSEX)会导致函数始终返回false -
ullTotalPhys和ullAvailPhys单位是字节,建议除以1024ULL * 1024ULL转MB,避免整型溢出(用ULL后缀) - 该API在UWP环境不可用,仅适用于桌面Win32程序
Linux下读取/proc/meminfo解析物理内存
Linux没有统一API,最可靠方式是解析/proc/meminfo文件。关键字段是MemTotal:和MemAvailable:(内核3.14+),老内核只能用MemFree:加Buffers/Cached估算,但误差较大。
- 逐行读取时注意跳过空行和注释行(以
#开头) - 字段名后有冒号和空格,匹配时建议用
std::string::find(":")定位,再用std::stoull转换数值 - 不要硬编码字段顺序——不同发行版或内核版本中字段位置可能变化
-
MemAvailable比MemFree更能反映实际可用内存,尤其在有大量page cache时
macOS用host_statistics64获取活跃/非活跃内存
macOS需通过Mach API调用host_statistics64,传入HOST_VM_INFO64 flavor。相比Linux和Windows,它不直接提供“可用内存”,而是分active_count、inactive_count、free_count等页计数,需乘以vm_page_size换算为字节。
- 必须先调用
host_port = mach_host_self()获取host port,否则host_statistics64返回KERN_INVALID_ARGUMENT - 返回的
vm_statistics64_data_t结构中,free_count近似于可用内存,但macOS会把部分inactive页计入可回收范围,实际可用量略高于此值 - 需要链接
-framework CoreFoundation(部分系统调用依赖)和-lSystem
跨平台封装时如何统一接口与规避陷阱
别试图抽象出“总内存/可用内存”两个浮点数就完事。各平台语义差异太大:Windows的ullAvailPhys接近Linux的MemAvailable,但macOS的free_count偏保守;而且macOS没有“物理内存总量”的直接等价字段(max_mem可能含未映射区域)。
立即学习“C++免费学习笔记(深入)”;
- 建议接口返回结构体,字段明确标注来源平台,例如
total_bytes、available_bytes、platform_hint(如"linux_memavailable") - Linux下若读
/proc/meminfo失败(容器环境可能无权限或挂载点被屏蔽),应降级返回0并记录errno,而非抛异常 - 所有平台都应做单位一致性处理——内部全用字节,对外提供
to_mb()或to_gb()辅助方法,避免用户自己除错
跨平台内存统计真正的难点不在代码长度,而在对“可用内存”定义的理解偏差。同一台机器,三个平台报出的“可用”数字可能相差20%以上,这不是bug,是设计使然。


















