检测内存页面大小

时间:2010-07-28 10:25:25

标签: c++ c memory operating-system hardware

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

7 个答案:

答案 0 :(得分:10)

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

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

答案 1 :(得分:8)

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

答案 2 :(得分:3)

是的,这是特定于平台的。在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。它依赖于有一些空闲内存,但它只需要两个连续的页面。它可能在某些(奇怪的)情况下有用。

答案 3 :(得分:2)

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;
}

答案 4 :(得分:1)

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

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

答案 5 :(得分:0)

跨操作系统,没有。

在Linux系统上:

#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);

答案 6 :(得分:-3)

我认为这个功能有帮助 [的DllImport( “KERNEL32.DLL”)]         public static extern void GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);