Namespaces
Variants

std:: aligned_alloc

From cppreference.net
< cpp ‎ | memory ‎ | c
Memory management library
( exposition only* )
Allocators
Uninitialized memory algorithms
Constrained uninitialized memory algorithms
Memory resources
Uninitialized storage (until C++20)
( until C++20* )
( until C++20* )
( until C++20* )

Garbage collector support (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
(C++11) (until C++23)
Definido en el encabezado <cstdlib>
void * aligned_alloc ( std:: size_t alignment, std:: size_t size ) ;
(desde C++17)

Asignar size bytes de almacenamiento no inicializado cuya alineación está especificada por alignment ( creando implícitamente objetos en el área de destino). El parámetro size debe ser un múltiplo integral de alignment .

Las siguientes funciones deben ser seguras para hilos:

Las llamadas a estas funciones que asignan o desasignan una unidad particular de almacenamiento ocurren en un único orden total, y cada llamada de desasignación happens-before la siguiente asignación (si existe) en este orden.

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, retorna el puntero al inicio de la memoria recién asignada. Para evitar una fuga de memoria, el puntero retornado debe ser desasignado con std::free o std::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, esto fue corregido por DR460 ).

Como ejemplo del requisito "compatible con 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 este requisito.

Los alineamientos fundamentales siempre están soportados. Si alignment es una potencia de dos y no mayor que alignof ( std:: max_align_t ) , aligned_alloc puede simplemente llamar a std::malloc .

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

Esta función no es compatible en 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 (para liberar con _aligned_free ).

Ejemplo

#include <cstdio>
#include <cstdlib>
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10 * sizeof *p1));
    std::printf("default-aligned address:   %p\n", static_cast<void*>(p1));
    std::free(p1);
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("1024-byte aligned address: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

Salida posible:

default-aligned address:   0x2221c20
1024-byte aligned address: 0x2222400

Véase también

(desde C++11) (obsoleto en C++23)
define el tipo adecuado para usar como almacenamiento no inicializado para tipos de tamaño dado
(plantilla de clase)
Documentación de C para aligned_alloc