检测内存页面大小

是否有一种可移植的方法来使用C或C ++代码(以编程方式)检测内存页面大小?

由于Boost是一个非常可移植的库,您可以使用mapped_region::get_page_size()函数来检索内存页面大小。

至于C ++标准,它没有提供这种可能性。

C对内存页面一无所知。 在posix系统上,你可以使用long pagesize = sysconf(_SC_PAGE_SIZE);

是的,这是特定于平台的。 在Linux上有sysconf(_SC_PAGESIZE) ,它似乎也是POSIX。 典型的C库使用辅助向量实现此function。 如果由于某种原因你没有C库或辅助矢量,你可以像这样确定页面大小:

 size_t get_page_size(void) { size_t n; char *p; int u; for (n = 1; n; n *= 2) { p = mmap(0, n * 2, PROT_NONE, MAP_ANONYMOUS | MAP_PRIVATE, -1, 0); if (p == MAP_FAILED) return -1; u = munmap(p + n, n); munmap(p, n * 2); if (!u) return n; } return -1; } 

我认为那也是POSIX。 它依赖于有一些空闲内存,但它只需要两个连续的页面。 它可能在某些(奇怪的)情况下有用。

它完全取决于平台,地址范围映射到哪些页面大小。 此外,页面大小不是系统范围的。 您可以根据用例从不同的页面大小区域分配内存。 而且你甚至可以拥有没有任何虚拟内存管理的平台。

因此,处理此主题的代码必须是特定于平台的。

Windows 10,Visual Studio 2017,C ++。 获取页面大小(以字节为单位)

 int main() { SYSTEM_INFO sysInfo; GetSystemInfo(&sysInfo); printf("%s %d\n\n", "PageSize[Bytes] :", sysInfo.dwPageSize); getchar(); return 0; } 

在整个操作系统中,没有。

在Linux系统上:

 #include  long sz = sysconf (_SC_PAGESIZE); 

我认为这个function有帮助。
[DllImport(“kernel32.dll”)] public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);