getpagesize() 返回系统默认内存页大小(通常为4096字节),在Linux/macOS等POSIX系统中由内核启动时确定,声明于<unistd.h>,无需额外链接库。

Linux/macOS 下用 getpagesize() 获取页大小
绝大多数 POSIX 系统(包括 Linux 和 macOS)提供标准函数 getpagesize(),它返回当前系统默认的内存页大小(单位字节),通常是 4096。这个值由内核在启动时确定,对用户空间程序是稳定的。
注意:该函数无需额外链接库,在 <unistd.h> 中声明,C++ 中可直接使用:
#include <unistd.h>
#include <iostream>
int main() {
std::cout << getpagesize() << "\n"; // 通常输出 4096
}
常见错误是误以为它能返回大页(huge page)大小——它不能。getpagesize() 只反映默认基础页大小;透明大页或显式 hugetlb 页面需通过其他机制(如 /proc/meminfo 或 mincore() + 地址探测)判断。
Windows 下用 GetSystemInfo() 查询 dwPageSize
Windows 没有 getpagesize(),但 GetSystemInfo() 填充的 SYSTEM_INFO 结构体中,dwPageSize 字段即为当前系统的页面大小(同样单位字节,通常 4096)。
立即学习“C++免费学习笔记(深入)”;
使用要点:
- 包含
<windows.h> - 结构体变量必须初始化(零初始化更安全)
- 该值在进程生命周期内不变,但不同 Windows 版本/配置下可能不同(例如某些 ARM64 设备支持 64KB 页)
示例:
#include <windows.h>
#include <iostream>
int main() {
SYSTEM_INFO si;
GetSystemInfo(&si);
std::cout << si.dwPageSize << "\n";
}
跨平台封装时别硬编码 4096
虽然 x86_64 Linux/macOS/Windows 普遍用 4096,但依赖硬编码会出问题:ARM64 Windows、某些嵌入式 Linux 或启用了 64KB 页面的 macOS(M1/M2 上部分场景)可能返回其他值。
推荐做法是运行时查询,而非预处理器宏判断:
- 避免
#ifdef _WIN32 ... #else getpagesize() ... #endif分支里各自写逻辑——容易漏掉头文件或链接依赖 - 统一抽象成一个内联函数,例如
page_size(),内部按平台调用对应 API - 若项目已用 CMake,可加编译期检查(如
check_function_exists(getpagesize HAVE_GETPAGESIZE)),但运行时仍应 fallback 到实际调用
为什么 sysconf(_SC_PAGESIZE) 和 getpagesize() 结果一样?
在 POSIX 系统上,sysconf(_SC_PAGESIZE) 与 getpagesize() 语义一致,都返回默认页大小。glibc 中后者就是对前者的简单封装。
区别在于:sysconf() 更通用(还能查线程数、打开文件数等),而 getpagesize() 更直白。实际项目中选哪个都行,但要注意:
-
sysconf(_SC_PAGESIZE)返回long,需检查是否为 -1(失败);getpagesize()返回int,失败时也返回 -1,但极少失败 - 某些极老 Unix 可能不支持
_SC_PAGESIZE,但现代 Linux/macOS/BSD 都支持 - 不要混淆
_SC_PAGE_SIZE(错拼)——正确常量名是_SC_PAGESIZE
真正容易被忽略的是:页大小 ≠ 内存对齐要求(如 alignof(std::max_align_t)),也不代表 mmap() 或 VirtualAlloc() 的最小分配粒度(后者可能是页大小的整数倍,尤其在保留内存时)。


















