最轻量跨平台采集cpu、内存、os信息应优先用std::filesystem读取系统文件(如/proc/cpuinfo、/proc/meminfo),辅以平台特化api(getlogicalprocessorinformation、sysctlbyname等),仅低频兜底使用std::system;需统一单位为字节、编译期宏判断平台、异常捕获文件访问。

用 std::filesystem 和 std::system 读取基础系统信息最轻量
跨平台采集 CPU、内存、OS 名称这类基础信息,没必要引入第三方库。C++17 的 std::filesystem 能统一访问路径(比如 /proc 或 C:WindowsSystem32),而 std::system 配合平台命令(uname -s / ver)可快速兜底。但要注意:std::system 启动 shell 有开销,且输出格式不可控,只适合一次性、低频调用。
- Linux/macOS 下优先走
/proc/sys/kernel/hostname、/proc/meminfo等文件,避免依赖 shell 命令 - Windows 下用
GetVersionExW(已弃用但兼容性好)或RtlGetVersion(需#include <windows.h></windows.h>),别硬塞ver命令 - 所有文件读取必须加异常捕获 ——
/proc在容器里可能被挂载为只读,std::filesystem::read_symlink在 macOS 上对某些路径会抛std::filesystem::filesystem_error
获取 CPU 核心数时,std::thread::hardware_concurrency() 不可靠
这个函数返回的是“建议并发数”,不是真实逻辑核心数。Windows 上它可能返回 0(尤其在旧版 MSVC 或启用了虚拟化时),Linux 上在 cgroups 限制下也可能低估。真正跨平台稳定的方式是:
- Linux:解析
/proc/cpuinfo中processor行数量(注意:超线程会重复计数,需结合core id和physical id判重) - macOS:用
sysctlbyname("hw.ncpu", &n, &len, nullptr, 0) - Windows:调用
GetLogicalProcessorInformation并统计RelationProcessorCore类型的条目 - 统一 fallback:若以上都失败,才用
std::thread::hardware_concurrency(),并加日志警告
内存总量采集要区分 MemTotal 和 PhysicalMemory,别直接除 1024
/proc/meminfo 的 MemTotal: 字段单位是 kB,而 Windows GetPhysicallyInstalledSystemMemory 返回字节数,macOS host_statistics 返回 page 数(通常 4KB/page)。直接硬除 1024 会出错 —— macOS 的 page size 可能不是 4KB(getpagesize() 才准确)。
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- Linux:用
std::stoll()提取MemTotal:后数值,乘以 1024 得字节 - Windows:调用
GetPhysicallyInstalledSystemMemory(&bytes),它返回的就是字节 - macOS:先
host_page_size(host_port, &page_size),再host_statistics(host_port, HOST_VM_INFO, ...)拿pages,最后pages * page_size - 所有平台最终统一转为 uint64_t 字节值,对外暴露
total_bytes()接口,不暴露原始单位
编译期检测平台比运行时 if (os == "win") 更安全
用宏判断比字符串匹配更可靠 —— 运行时识别 OS 容易受环境变量、容器伪装(如 uname -r 返回 Linux 但实际是 WSL2)干扰。CMake 或编译器内置宏才是源头可信依据:
- Linux:
#ifdef __linux__(GCC/Clang),不是#ifdef linux - macOS:
#ifdef __APPLE__ && __MACH__(同时排除 iOS) - Windows:
#ifdef _WIN32(覆盖 32/64 位,_WIN64可选) - 避免用
getenv("OS")或system("uname")做平台判定 —— 它们可能被篡改、缺失,或在沙箱中被禁用
跨平台库最难缠的不是功能实现,而是路径分隔符、换行符、权限模型这些隐式差异 —— 比如 Windows 的 \? 路径前缀、Linux 的 /proc/self/exe 符号链接跳转深度限制、macOS 对 /dev/disk* 的权限管控。写死逻辑不如留钩子:给每个平台路径构造函数加 std::function<:string> factory</:string> 参数,方便上层定制。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










