Espacios de nombres
Variantes
Acciones

std::aligned_alloc

De cppreference.com
< cpp‎ | memory‎ | c
 
 
Biblioteca de servicios
 
Gestión de memoria dinámica
Punteros inteligentes
(C++11)
(C++11)
(C++11)
(hasta C++17)
(C++11)
(C++23)
Asignadores de memoria
Recursos de memoria
Almacenamiento no inicializado
Algoritmos de memoria no inicializada
Algoritmos restringidos de memoria no inicializada
Apoyo para recolección de basura
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
(C++11)(hasta C++23)
Misceláneos
(C++20)
(C++11)
(C++11)
Biblioteca de C
aligned_alloc
(C++17)
 
Definido en el archivo de encabezado <cstdlib>
void* aligned_alloc( std::size_t alignment, std::size_t size );
(desde C++17)

Asigna size bytes de almacenamiento no inicializado cuya alineación se especifica mediante alignment. El parámetro size especifica un tamaño y debe ser un múltiplo entero de alignment.

Se requiere que las siguientes funciones sean seguras frente a hilos:

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

(desde C++11)

Contenido

[editar] Parámetros

alignment - Especifica la alineación. Debe ser una alineación válida respaldada por la implementación.
size - Número de bytes a asignar. Un múltiplo entero de alignment.

[editar] Valor de retorno

En caso de éxito, devuelve el puntero al principio de la memoria recién asignada. Para evitar una fuga de memoria, el puntero devuelto debe desasignarse con std::free() or std::realloc().

En caso de error, devuelve un puntero nulo.

[editar] Notas

Pasar un tamaño (size) que no es un múltiplo entero de alignment o un alignment que no es válido o no es compatible con la implementación hace que la función falle y devuelva un puntero nulo (C11, tal como se publicó, especificó un comportamiento no definido en este caso, esto fue corregido por DR 460).

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 estos requisitos.

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

[editar] Ejemplo

#include <cstdio>
#include <cstdlib>
 
int main()
{
    int* p1 = static_cast<int*>(std::malloc(10*sizeof *p1));
    std::printf("dirección alineada por defecto :   %p\n", static_cast<void*>(p1));
    std::free(p1);
 
    int* p2 = static_cast<int*>(std::aligned_alloc(1024, 1024));
    std::printf("dirección alineada a 1024 bytes: %p\n", static_cast<void*>(p2));
    std::free(p2);
}

Posible salida:

dirección alineada por defecto :   0x2221c20
dirección alineada a 1024 bytes: 0x2222400

[editar] Véase también

Define el tipo adecuado para su uso como almacenamiento sin inicializar para tipos de un tamaño dado
(plantilla de clase) [editar]
Documentación de C para aligned_alloc