std::aligned_alloc
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
(C++11) |
Define el tipo adecuado para su uso como almacenamiento sin inicializar para tipos de un tamaño dado (plantilla de clase) |
Documentación de C para aligned_alloc
|