Espacios de nombres
Variantes
Acciones

aligned_alloc

De cppreference.com
< c‎ | memory
Definido en la cabecera <stdlib.h>
void *aligned_alloc( size_t alineamiento, size_t tamaño );
(desde C11)

Asigna el tamaño en bytes del almacenamiento no inicializado cuya alineación se especifica mediante alineamiento. El parámetro tamaño debe ser un múltiplo entero del alineamiento.

aligned_alloc es seguro para hilos: se comporta como si sólo accediera a las posiciones de memoria visibles a través de su argumento, y no a cualquier almacenamiento estático.

Una llamada previa a free o realloc que desasigna una región de memoria se sincroniza con una llamada a un aligned_alloc que asigna la misma o parte de la misma región de memoria. Esta sincronización se produce después de cualquier acceso a la memoria por parte de la función de desasignación y antes de cualquier acceso a la memoria por parte de aligned_alloc. Hay un solo orden total de todas las funciones de asignación y desasignación que operan en cada región particular de la memoria.

Contenido

[editar] Parametros

alineamiento - especifica la alineación. Debe ser una alineación válida soportada por la implementación.
tamaño - número de bytes a asignar. Un múltiplo entero del alineamiento

[editar] Valor de retorno

En caso de éxito, devuelve el puntero al principio de la nueva memoria asignada. Para evitar una fuga de memoria, el puntero devuelto debe estar desasignado con free() o realloc().

En caso de fallo, devuelve un puntero nulo.

[editar] Observaciones

Pasar un tamaño que no es un múltiplo entero del alineamiento, un alineamiento que no es válido o que no está soportada por la implementación hace que la función falle y devuelva un puntero nulo (C11, tal y como se publicó, especificó un comportamiento indefinido en este caso, esto fue corregido por el DR 460). La eliminación de las restricciones de tamaño permitio la asignación de objetos pequeños a límites de alineación restrictivos (similar a alignas) ha sido propuesta en el n2072.

Como ejemplo del requisito "soportado por la implementación", la función POSIX posix_memalign acepta cualquier alineamiento alineación que sea una potencia de dos y un múltiplo de sizeof(void *), y las implementaciones basadas en POSIX de aligned_alloc heredan estos requisitos.

La alineación regular de malloc alinea la memoria adecuada para cualquier tipo de objeto (lo que, en la práctica, significa que está alineada con alignof(max_align_t)). Esta función es útil para asignaciones sobrealineadas, tales como SSE, línea de caché o límite de paginación de VM.

[editar] Ejemplo

#include <stdio.h>
#include <stdlib.h>
 
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("direccion alineada por defecto:   %p\n", (void*)p1);
    free(p1);
 
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("direccion alineada de 1024-bytes: %p\n", (void*)p2);
    free(p2);
}

Posible salida:

direccion alineada por defecto:   0x1e40c20
direccion alineada de 1024-bytes: 0x1e41000

[editar] Referencias

  • Standard C11 (ISO/IEC 9899:2011):
  • 7.22.3.1 The aligned_alloc function (p: 347-348)

[editar] Véase también

Documentación de C++ para aligned_alloc