GNU/Linux >> Tutoriales Linux >  >> Linux

¿Cómo asignar memoria que está alineada con el tamaño de página?

No creo que sea posible solo con malloc. Puedes usar memalign():

char *data = memalign(PAGESIZE, alloc_size);

Donde PAGESIZE es el tamaño de una página y alloc_size es el tamaño de la memoria que se asignará.

El tamaño de la página se puede encontrar con sysconf(_SC_PAGESIZE) .


Hay funciones para esto que se supone que debes usar.

Si no puede, por alguna razón, entonces la forma en que generalmente se hace es agregando el tamaño del bloque al tamaño de la asignación, luego usando trucos matemáticos de números enteros para redondear el puntero.

Algo como esto:

/* Note that alignment must be a power of two. */
void * allocate_aligned(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  const uintptr_t mem = (uintptr_t) malloc(size + alignment);
  return (void *) ((mem + mask) & ~mask);
}

Esto no ha sido probado muy profundamente, pero entiendes la idea.

Tenga en cuenta que se vuelve imposible averiguar el puntero adecuado a free() el recuerdo después. Para arreglar eso, tendríamos que agregar alguna maquinaria adicional:

typedef struct {
  void *aligned;
} AlignedMemory;

AlignedMemory * allocate_aligned2(size_t size, size_t alignment)
{
  const size_t mask = alignment - 1;
  AlignedMemory *am = malloc(sizeof *am + size + alignment);
  am->aligned = (void *) ((((uintptr_t) (am + 1)) + mask) & ~mask);
  return am;
}

Esto envuelve un poco el truco del puntero y le da un puntero que puede free() , pero debe eliminar la referencia al aligned puntero para obtener el puntero correctamente alineado.


Linux
  1. Cómo borrar la caché de memoria en Linux

  2. ¿Cómo ordenar la salida Du por tamaño?

  3. Cómo obtener el tamaño del directorio en Linux

  4. ¿Cómo obtener mediante programación el tamaño de la página de caché de la CPU en C++?

  5. cómo verificar el tamaño del montón asignado para jvm por linux

Cómo usar du Command en Linux

Cómo borrar la memoria de intercambio en Linux

¿Cómo perfilar el uso de la memoria?

¿Cómo cambio el tamaño de fuente en Dwarf-fortress?

¿Cómo se determina el tamaño de página en el espacio de direcciones virtuales?

¿Cómo puedo ordenar la salida du -h por tamaño?