aligned_alloc
|
Definido en el encabezado
<stdlib.h>
|
||
| (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
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
|