2010-07-28 264 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);