2010-07-28 10 views

Respuesta

9

Dado que Boost es una biblioteca bastante portátil, puede usar la función mapped_region::get_page_size() para recuperar el tamaño de la página de memoria.

En cuanto a C++ Standard no ofrece tal posibilidad.

8

C no sabe nada acerca de las páginas de memoria. En los sistemas posix puede usar long pagesize = sysconf(_SC_PAGE_SIZE);

1

Es completamente dependiente de la plataforma qué rangos de direcciones se asignan a qué tamaños de página. Además, el tamaño de página no abarca todo el sistema. Puede asignar memoria desde diferentes regiones de tamaño de página de acuerdo con el caso de uso. E incluso puede tener plataformas sin administración de memoria virtual.

Por lo tanto, el código que maneja este tema debe ser específico de la plataforma.

+0

Desconecta entre tu explicación y la conclusión; aplicar la misma lógica nos diría que determinar el tamaño de un puntero es específico de la plataforma. – kfsone

-3

Creo que esta función ayuda.
[DllImport ("kernel32.dll")] public static extern void GetSystemInfo ([MarshalAs (UnmanagedType.Struct)] ref SYSTEM_INFO lpSystemInfo);

+2

La pregunta dice "C", "C++" y "portátil" y además de eso, ni siquiera describiste cómo llegar a un tamaño de página. – kfsone

3

Sí, esto es específico de la plataforma. En Linux hay sysconf(_SC_PAGESIZE), que también parece ser POSIX. Una biblioteca C típica implementa esto usando el vector auxiliar. Si por alguna razón usted no tiene una biblioteca C o el vector auxiliar que podría determinar el tamaño de la página como esta:

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; 
} 

Eso también es POSIX, creo. Se basa en que haya algo de memoria libre, pero solo necesita dos páginas consecutivas. Puede ser útil en algunas circunstancias (extrañas).

0

En todos los sistemas operativos, no.

En los sistemas Linux:

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