std:: aligned_alloc
|
|
|||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
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 versiones de biblioteca de operator new y operator delete
- Versiones de reemplazo del usuario de operator new y operator delete globales
- std::calloc , std::malloc , std::realloc , std::aligned_alloc , std::free
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
|
|