检测内存页大小

15

有没有一种便携式的方式可以使用C或C++代码(通过编程)检测内存页面大小?


8
没有。 - anon
4
不,因为C和C++也存在于没有虚拟内存的平台上。 - zvrba
7个回答

17

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


17

我在Windows上使用Boost 1.81.0,但它似乎返回SYSTEM_INFO::dwAllocationGranularity而不是dwPageSize,错误地返回了65536而不是4096。 - chris

12

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

8
跨操作系统而言,不行。
在Linux系统中:
#include <unistd.h>
long sz = sysconf (_SC_PAGESIZE);

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

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


你能解释一下你在使用双重 munmap 做什么吗? - Daniel Walker

1

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

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


你的解释和结论之间存在断层;应用相同的逻辑,我们可以得出确定指针大小是平台特定的结论。 - kfsone

-4

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


5
问题说的是'C'、'C++'和'可移植性',而且你甚至没有描述如何从那里得到页面大小。 - kfsone

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接