Namespaces
Variants

aligned_alloc

From cppreference.net
Definido en el encabezado <stdlib.h>
void * aligned_alloc ( size_t alignment, size_t size ) ;
(desde C11)

Asigna size bytes de almacenamiento no inicializado cuya alineación está especificada por alignment . El parámetro size debe ser un múltiplo integral de alignment .

aligned_alloc es seguro para hilos: se comporta como si solo accediera a las ubicaciones de memoria visibles a través de su argumento, y no a ningún almacenamiento estático.

Una llamada previa a free , free_sized , y free_aligned_sized (desde C23) o realloc que desasigna una región de memoria se sincroniza con una llamada a aligned_alloc que asigna la misma o una parte de la misma región de memoria. Esta sincronización ocurre después de cualquier acceso a la memoria por la función desasignadora y antes de cualquier acceso a la memoria por aligned_alloc . Existe un orden total único para todas las funciones de asignación y desasignación que operan sobre cada región particular de memoria.

Contenidos

Parámetros

alignment - especifica la alineación. Debe ser una alineación válida soportada por la implementación.
size - número de bytes a asignar. Un múltiplo integral de alignment

Valor de retorno

En caso de éxito, devuelve el puntero al inicio de la memoria recién asignada. Para evitar una pérdida de memoria, el puntero devuelto debe ser liberado con free o realloc .

En caso de fallo, devuelve un puntero nulo.

Notas

Pasar un size que no es un múltiplo integral de alignment o un alignment que no es válido o no está soportado por la implementación causa que la función falle y retorne un puntero nulo (C11, tal como se publicó, especificaba comportamiento indefinido en este caso, lo cual fue corregido por DR460 ). La eliminación de restricciones de tamaño para hacer posible asignar objetos pequeños en límites de alineación restrictivos (similar a alignas ) ha sido propuesta por N2072 .

Como ejemplo del requisito "soportado por la implementación", la función POSIX posix_memalign acepta cualquier alignment 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.

Las alineaciones fundamentales siempre son compatibles. Si alignment es una potencia de dos y no mayor que _Alignof ( max_align_t ) , aligned_alloc puede simplemente llamar a malloc .

La función malloc regular alinea la memoria adecuada para cualquier tipo de objeto con una alineación fundamental. La función aligned_alloc es útil para asignaciones con sobrealineación, como para los límites de SSE , línea de caché o página de VM .

Esta función no es compatible con la biblioteca en tiempo de ejecución de Microsoft C porque su implementación de std::free es incapaz de manejar asignaciones alineadas de cualquier tipo. En su lugar, MS CRT proporciona _aligned_malloc (que debe liberarse con _aligned_free ).

Ejemplo

#include <stdio.h>
#include <stdlib.h>
int main(void)
{
    int *p1 = malloc(10*sizeof *p1);
    printf("default-aligned addr:   %p\n", (void*)p1);
    free(p1);
    int *p2 = aligned_alloc(1024, 1024*sizeof *p2);
    printf("1024-byte aligned addr: %p\n", (void*)p2);
    free(p2);
}

Salida posible:

default-aligned addr:   0x1e40c20
1024-byte aligned addr: 0x1e41000

Referencias

  • Estándar C23 (ISO/IEC 9899:2024):
  • 7.22.3.1 La función aligned_alloc (p: TBD)
  • Estándar C17 (ISO/IEC 9899:2018):
  • 7.22.3.1 La función aligned_alloc (p: 253)
  • Estándar C11 (ISO/IEC 9899:2011):
  • 7.22.3.1 La función aligned_alloc (p: 347-348)

Véase también

Documentación de C++ para aligned_alloc