Is there a portable way to detect (programmatically) the memory page size using C or C++ code ?
Since Boost
is a pretty portable library you could use mapped_region::get_page_size()
function to retrieve the memory page size.
As for C++ Standard it gives no such a possibility.
C doesn't know anything about memory pages. On posix systems you can use long pagesize = sysconf(_SC_PAGE_SIZE);
Yes, this is platform-specific. On Linux there's sysconf(_SC_PAGESIZE)
, which also seems to be POSIX. A typical C library implements this using the auxiliary vector. If for some reason you don't have a C library or the auxiliary vector you could determine the page size like this:
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;
}
That's also POSIX, I think. It relies on there being some free memory, but it only needs two consecutive pages. It might be useful in some (weird) circumstances.
Windows 10, Visual Studio 2017, C++. Get the page size in bytes.
int main()
{
SYSTEM_INFO sysInfo;
GetSystemInfo(&sysInfo);
printf("%s %d\n\n", "PageSize[Bytes] :", sysInfo.dwPageSize);
getchar();
return 0;
}
It is entirely platform dependent which address-ranges are mapped to which page-sizes. Further the pagesize is not system-wide. You can allocate memory from different page-size regions according to the use case. And you can even have platforms without any virtual memory managment.
So, code handling this topic must be platform specific.
Across operating systems, no.
On Linux systems:
#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);
I think this function helps.
[DllImport("kernel32.dll")]
public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);
来源:https://stackoverflow.com/questions/3351940/detecting-the-memory-page-size