检测内存页面大小

Fra*_*ger 7 c c++ memory hardware operating-system

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

Kir*_*sky 11

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

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


nos*_*nos 8

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


小智 8

跨操作系统,没有。

在 Linux 系统上:

#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);
Run Code Online (Sandbox Code Playgroud)


小智 6

是的,这是特定于平台的。在 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;
}
Run Code Online (Sandbox Code Playgroud)

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


Ted*_*Ted 6

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;
}
Run Code Online (Sandbox Code Playgroud)