有没有一种便携式的方式可以使用C或C++代码(通过编程)检测内存页面大小?
有没有一种便携式的方式可以使用C或C++代码(通过编程)检测内存页面大小?
C语言对于内存页面一无所知。在POSIX系统上,您可以使用 long pagesize = sysconf(_SC_PAGE_SIZE);
。
由于 Boost
是一个相当便携的库,您可以使用mapped_region::get_page_size()
函数来检索内存页面大小。
至于C++标准,它没有这样的可能性。
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;
}
#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);
是的,这是与平台相关的。在Linux上,有sysconf(_SC_PAGESIZE)
,似乎也符合POSIX标准。典型的C库使用辅助向量实现这一点。如果由于某种原因您没有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技术。它依赖于有一些可用内存,但只需要两个连续的页面。在某些(奇怪的)情况下可能会有用。
munmap
做什么吗? - Daniel Walker地址范围映射到哪些页面大小完全取决于平台。此外,页面大小不是系统范围内的。您可以根据用例从不同的页面大小区域分配内存。甚至可以有没有任何虚拟内存管理的平台。
因此,处理此主题的代码必须是特定于平台的。
我认为这个函数很有帮助。
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);