2010-07-28 4 views
6

Есть ли переносной способ определения (программно) размера страницы памяти с использованием кода C или C++?определение размера страницы памяти

+8

Нет, нет. – 2010-07-28 10:27:10

+3

Нет, нет, потому что C и C++ существуют также для платформ без виртуальной памяти. – zvrba

ответ

9

С Boost - довольно портативная библиотека, вы можете использовать функцию mapped_region::get_page_size() для извлечения размера страницы памяти.

Что касается стандарта C++, это не дает такой возможности.

8

C ничего не знает о страницах памяти. На системах posix вы можете использовать long pagesize = sysconf(_SC_PAGE_SIZE);

1

Полностью зависит от платформы, какие диапазоны адресов сопоставляются с размерами страниц. Кроме того, размер страниц не является общесистемным. Вы можете выделить память из разных областей размера страницы в соответствии с вариантом использования. И вы даже можете иметь платформы без управления виртуальной памятью.

Итак, обработка кода в этом разделе должна быть специфичной для платформы.

+0

Отсоедините между вашим объяснением и заключением; применение той же логики подсказывает нам, что определение размера указателя является специфичным для платформы. – kfsone

-3

Я думаю, что эта функция помогает.
[DllImport ("kernel32.dll")] public static extern void GetSystemInfo ([MarshalAs (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

+2

Вопрос говорит «C», «C++» и «Portable», и, кроме того, вам не удалось описать, как получить от этого размер страницы. – kfsone

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); 
Смежные вопросы