Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

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 _Alignas también está disponible como macro de conveniencia alignas , disponible en el encabezado <stdalign.h> .

(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

1,2) el resultado de la expresión , a menos que sea cero
3,4) el requisito de alineación de type , es decir, a _Alignof ( type ) (hasta C23) alignof ( type ) (desde C23)

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

alignas , _Alignas

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

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