2010-07-28 227 views
6

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

+8

没有,没有。 – 2010-07-28 10:27:10

+3

不,因为没有虚拟内存的平台也存在C和C++。 – zvrba 2010-07-28 11:20:06

回答

8

C不知道任何关于内存页。在posix系统上,您可以使用long pagesize = sysconf(_SC_PAGE_SIZE);

1

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

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

+0

断开您的解释和结论;应用相同的逻辑会告诉我们,确定指针的大小是特定于平台的。 – kfsone 2013-12-07 23:14:37

-3

我觉得这个功能有帮助。公共静态extern无效GetSystemInfo([MarshalAs(UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

+2

问题是'C','C++'和'portable',除此之外,您甚至没有描述如何从页面大小获取。 – kfsone 2013-12-07 23:10:23

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

0

在整个操作系统中,没有。

在Linux系统上:

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