代码之家  ›  专栏  ›  技术社区  ›  Franck Freiburger

检测内存页大小

  •  6
  • Franck Freiburger  · 技术社区  · 14 年前

    是否有一种便携的方式来检测(编程)内存页大小,使用C或C++代码?

    7 回复  |  直到 14 年前
        1
  •  12
  •   Kirill V. Lyadvinsky    14 年前

    Boost 是一个非常便携的图书馆,你可以使用 mapped_region::get_page_size()

    对于C++标准,它没有这样的可能性。

        2
  •  12
  •   nos    14 年前

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

        3
  •  6
  •   Ted    7 年前

    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
  •  4
  •   Edmund Grimley Evans    8 年前

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

        5
  •  1
  •   DarthCoder    14 年前

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

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

        6
  •  1
  •   user6269400    8 年前

    在Linux系统上:

    #include <unistd.h>
    long sz = sysconf (_SC_PAGESIZE);
    
        7
  •  -4
  •   HChen    14 年前

    我认为这个功能有帮助。
    [DllImport(“kernel32.dll”)] public static extern void GetSystemInfo([marshallas(UnmanagedType.Struct)]ref SYSTEM\u INFO lpSystemInfo);