_Alignas (since C11) (deprecated in C23) , alignas (since C23)
Aparece en la declaración sintaxis como uno de los especificadores de tipo para modificar el requisito de alineación del objeto que se está declarando.
Contenidos |
Sintaxis
_Alignas
(
expresión
)
|
(1) | (desde C11) | |||||||
alignas
(
expresión
)
|
(2) | (desde C23) | |||||||
_Alignas
(
tipo
)
|
(3) | (desde C11) | |||||||
alignas
(
tipo
)
|
(4) | (desde C23) | |||||||
| expression | - | cualquier expresión constante entera cuyo valor sea una alineación válida o cero |
| type | - | cualquier nombre de tipo |
|
La palabra clave
|
(hasta C23) |
Explicación
El
_Alignas
(hasta C23)
alignas
(desde C23)
especificador solo puede usarse al declarar objetos que no son
campos de bits
, y no tienen la clase de almacenamiento
register
. No puede usarse en declaraciones de parámetros de función, ni puede usarse en un typedef.
Cuando se utiliza en una declaración, el objeto declarado tendrá su requisito de alineamiento establecido en
excepto cuando esto debilitaría la alineación que el tipo habría tenido naturalmente.
Si expression se evalúa como cero, este especificador no tiene efecto.
Cuando múltiples
_Alignas
(until C23)
alignas
(since C23)
especificadores aparecen en la misma declaración, se utiliza el más estricto.
_Alignas
(hasta C23)
alignas
(desde C23)
el especificador solo necesita aparecer en la
definición
de un objeto, pero si alguna declaración usa
_Alignas
(hasta C23)
alignas
(desde C23)
, debe especificar la misma alineación que el
_Alignas
(hasta C23)
alignas
(desde C23)
en la definición. El comportamiento es indefinido si diferentes unidades de traducción especifican diferentes alineaciones para el mismo objeto.
Notas
En C++, el especificador
alignas
también puede aplicarse a las declaraciones de tipos de clase/struct/union y enumeraciones. Esto no es compatible en C, pero la alineación de un tipo struct puede controlarse usando
_Alignas
(hasta C23)
alignas
(desde C23)
en una declaración de miembro.
Palabras clave
Ejemplo
#include <stdalign.h> #include <stdio.h> // cada objeto de tipo struct sse_t estará alineado al límite de 16 bytes // (nota: requiere soporte para DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // cada objeto de tipo struct data estará alineado al límite de 128 bytes struct data { char x; alignas(128) char cacheline[128]; // array de char sobrealineado, // no array de chars sobrealineados }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes de relleno + array de 128 bytes)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // esta instancia de data está alineada aún más estrictamente (void)d; // suprime la advertencia "posiblemente no utilizado" }
Salida:
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
Informes de defectos
Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares de C publicados anteriormente.
| DR | Aplicado a | Comportamiento publicado | Comportamiento correcto |
|---|---|---|---|
| DR 444 | C11 |
_Alignas
no estaba permitido en miembros de struct y union
|
permitido |
Referencias
- Estándar C23 (ISO/IEC 9899:2024):
-
- 6.7.5 Especificador de alineación (p: TBD)
-
- 6.2.8 Alineación de objetos (p: TBD)
-
- 7.15 Alineación <stdalign.h> (p: TBD)
- Estándar C17 (ISO/IEC 9899:2018):
-
- 6.7.5 Especificador de alineación (p: 92)
-
- 6.2.8 Alineación de objetos (p: 36-37)
-
- 7.15 Alineación <stdalign.h> (p: 196)
- Estándar C11 (ISO/IEC 9899:2011):
-
- 6.7.5 Especificador de alineación (p: 127-128)
-
- 6.2.8 Alineación de objetos (p: 48-49)
-
- 7.15 Alineación <stdalign.h> (p: 268)
Véase también
|
(C11)
|
un tipo con requisito de alineación tan grande como cualquier otro tipo escalar
(typedef) |
| _Alignof (hasta C23) alignof (desde C23) |
consulta los requisitos de alineación de un objeto
(operador) |
|
Documentación de C++
para
alignas
especificador
|
|