【问题标题】:detecting the memory page size检测内存页面大小
【发布时间】:2011-03-22 02:01:42
【问题描述】:

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

【问题讨论】:

  • 不,没有。
  • 不,因为 C 和 C++ 也存在于没有虚拟内存的平台上。

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


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      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】:

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

        【讨论】:

          【解决方案5】:

          跨操作系统,没有。

          在 Linux 系统上:

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

          【讨论】:

            【解决方案6】:

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

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

            【讨论】:

            • 你的解释和结论之间的脱节;应用相同的逻辑会告诉我们确定指针的大小是特定于平台的。
            【解决方案7】:

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

            【讨论】:

            • 问题说“C”、“C++”和“便携式”,最重要的是,您甚至没有描述如何从它获得页面大小。
            猜你喜欢
            • 2014-07-14
            • 1970-01-01
            • 2018-07-27
            • 1970-01-01
            • 2016-09-26
            • 2013-01-13
            • 1970-01-01
            • 2010-11-30
            • 2014-02-28
            相关资源
            最近更新 更多