需依赖操作系统接口:Windows用GetProcessMemoryInfo读PeakWorkingSetSize;Linux解析/proc/self/status的VmHWM字段;macOS用task_info获取phys_footprint并自行维护峰值;亦可选用sigar等跨平台库或C++17条件编译封装。

如果您需要在 C++ 程序中实时获取系统当前物理内存占用的峰值(即自进程启动以来达到过的最高物理内存使用量),则需依赖操作系统提供的特定接口。不同平台的实现机制差异显著,无法通过标准 C++ 库直接完成。以下是针对主流操作系统的多种可行监控方法:
一、Windows 平台:使用 GetProcessMemoryInfo API
该方法通过 Windows PSAPI 库调用 GetProcessMemoryInfo 函数,读取 PROCESS_MEMORY_COUNTERS 结构中的 PeakWorkingSetSize 字段,该字段精确记录进程生命周期内工作集内存使用的峰值(单位为字节)。
1、在源文件顶部包含必要头文件:#include
2、链接 psapi.lib 库,在项目设置中添加或在代码中加入 #pragma comment(lib, "psapi.lib")。
3、声明 PROCESS_MEMORY_COUNTERS 结构体变量,并调用 GetProcessMemoryInfo 函数,传入 GetCurrentProcess() 作为句柄。
4、检查函数返回值是否为非零,若成功则读取 pmc.PeakWorkingSetSize 成员值。
二、Linux 平台:解析 /proc/self/status 文件
Linux 内核通过 /proc 文件系统向用户空间暴露进程统计信息,其中 VmPeak 字段明确表示进程启动后虚拟内存使用峰值(单位为 KB),而物理内存峰值可通过分析 RSS 相关字段间接推导;但严格意义上的物理内存占用峰值无直接等价字段,VmHWM(Hierarchical Working Set Memory)字段提供实际物理内存使用峰值(单位 KB),需确保内核版本 ≥ 2.6.32 且启用 CONFIG_MMU。
1、使用 std::ifstream 打开 /proc/self/status 文件路径。
2、逐行读取并查找以 "VmHWM:" 开头的行。
3、跳过前缀与空白字符后,提取后续数值部分并转换为 size_t 类型。
4、将结果乘以 1024 得到字节数,即为当前进程物理内存占用峰值。
三、macOS 平台:调用 task_info 接口
macOS 提供 Mach 接口 task_info,配合 TASK_BASIC_INFO_64 结构体可获取任务级内存统计,其中 phys_footprint 字段代表当前物理内存占用(含压缩页),但该结构体不直接提供历史峰值;需结合 host_statistics 获取 host_vm_info64 中的 vm_stat 的v_wire_count、v_active_count等字段并持续采样比对,或使用更轻量方式:读取 /proc/self/statm(仅在启用 proc_translator 时可用)或依赖 libtopstat。
1、引入 Mach 头文件:#include
2、获取当前 task 的端口:task_t current_task = mach_task_self();
3、声明 task_basic_info_64 tbi;mach_msg_type_number_t count = TASK_BASIC_INFO_64_COUNT;
4、调用 task_info(current_task, TASK_BASIC_INFO_64, (task_info_t)&tbi, &count),检查返回值为 KERN_SUCCESS。
5、tbi.phys_footprint 字段即为当前物理内存占用字节数,峰值需由调用方自行维护最大值变量并在每次采样后更新。
四、跨平台封装方案:使用第三方库 sigar 或 libproc
sigar(System Information Gatherer and Reporter)提供统一 API 抽象各平台内存指标,其 get_mem() 接口返回结构体含 PhysicalTotal、PhysicalUsed、PhysicalFree 及 PhysicalMax(即物理内存峰值)字段;libproc(macOS/Linux)亦支持类似抽象,但 Windows 支持有限。采用此类库可规避平台判断逻辑,但引入外部依赖。
1、下载并编译 sigar 源码,链接 libsigar.a 或 .lib。
2、包含头文件 #include
3、声明 sigar_mem_t mem;调用 sigar_mem_get(sigar, &mem)。
4、读取 mem.physical_max 成员,该值单位为字节,即系统级物理内存占用历史峰值。
五、C++17 起基于 std::filesystem 与条件编译的轻量适配
不引入外部依赖的前提下,利用 C++17 标准库的 std::filesystem 配合预处理器指令,可构建简洁的跨平台读取逻辑:Windows 走 API 路径,Linux/macOS 走文件路径,所有分支均返回 uint64_t 类型的峰值字节数,由调用者统一处理。
1、使用 #ifdef _WIN32 包裹 Windows 分支代码,内部调用 GetProcessMemoryInfo。
2、使用 #elif defined(__linux__) 包裹 Linux 分支,读取 /proc/self/status 中 VmHWM 行。
3、使用 #elif defined(__APPLE__) && defined(__MACH__) 包裹 macOS 分支,执行 task_info + 自维护 max_phys_footprint 变量。
4、每个分支末尾统一 return 峰值字节数,并确保函数签名一致,例如:uint64_t get_physical_memory_peak();
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











