Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Especifica el requisito de alineamiento de un tipo o un objeto.

Contenidos

Sintaxis

alignas( expresión )
alignas( id-de-tipo )
alignas( paquete ... )
1) expression debe ser una expresión constante integral que evalúe a cero, o a un valor válido para una alineación o alineación extendida.
2) Equivalente a alignas ( alignof ( type-id ) ) .
3) Equivalente a múltiples especificadores alignas aplicados a la misma declaración, uno para cada miembro del parameter pack , que puede ser un paquete de parámetros de tipo o constante.

Explicación

El alignas especificador puede aplicarse a:

  • la declaración o definición de una class ;
  • la declaración de un miembro de datos de clase que no sea un campo de bits;
  • la declaración de una variable, excepto que no puede aplicarse a los siguientes:
    • un parámetro de función;
    • el parámetro de excepción de una cláusula catch.

El objeto o el tipo declarado por dicha declaración tendrá su requisito de alineación igual a la expresión no nula más estricta (mayor) de todos los expression especificadores alignas utilizados en la declaración, a menos que debilite la alineación natural del tipo.

Si el alignas más estricto (más grande) en una declaración es más débil que la alineación que tendría sin ningún especificador alignas (es decir, más débil que su alineación natural o más débil que alignas en otra declaración del mismo objeto o tipo), el programa está mal formado:

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: la alineación de U habría sido 8 sin alignas(1)

Las alineaciones no válidas distintas de cero, como alignas ( 3 ) están mal formadas.

Las alineaciones válidas no nulas que son más débiles que otra alignas en la misma declaración son ignoradas.

alignas ( 0 ) siempre se ignora.

Notas

A partir del estándar ISO C11, el lenguaje C tiene la palabra clave _Alignas y define alignas como una macro de preprocesador que se expande a la palabra clave en el encabezado <stdalign.h> .

En C++, this es una palabra clave, y

los encabezados <stdalign.h> y <cstdalign> no definen dicha macro. Sin embargo, definen la constante macro __alignas_is_defined .

(hasta C++20)

el encabezado <stdalign.h> no define dicha macro. Sin embargo, define la constante macro __alignas_is_defined .

(desde C++20)

Palabras clave

alignas

Ejemplo

#include <iostream>
// Cada objeto de tipo struct_float estará alineado
// al límite alignof(float) (normalmente 4):
struct alignas(float) struct_float
{
    // tu definición aquí
};
// Cada objeto de tipo sse_t estará alineado al límite de 32 bytes:
struct alignas(32) sse_t
{
    float sse_data[4];
};
int main()
{
    struct default_aligned
    {
        float data[4];
    } a, b, c;
    sse_t x, y, z;
    std::cout
        << "alignof(struct_float) = " << alignof(struct_float) << '\n'
        << "sizeof(sse_t) = " << sizeof(sse_t) << '\n'
        << "alignof(sse_t) = " << alignof(sse_t) << '\n'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

Salida posible:

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

Informes de defectos

Los siguientes informes de defectos que modifican el comportamiento se aplicaron retroactivamente a los estándares publicados anteriormente de C++.

DR Se aplica a Comportamiento publicado Comportamiento correcto
CWG 1437 C++11 alignas podía usarse en declaraciones de alias prohibido
CWG 2354 C++11 alignas podía aplicarse a la declaración de una enumeración prohibido

Referencias

  • Estándar C++23 (ISO/IEC 14882:2024):
  • 9.12.4 Atributo de dependencia de portado [dcl.attr.depend]
  • Estándar C++20 (ISO/IEC 14882:2020):
  • 9.12.3 Atributo de dependencia de transporte [dcl.attr.depend]
  • Estándar C++17 (ISO/IEC 14882:2017):
  • 10.6.3 Atributo carries dependency [dcl.attr.depend]
  • Estándar C++14 (ISO/IEC 14882:2014):
  • 7.6.4 Atributo transporta dependencia [dcl.attr.depend]
  • Estándar C++11 (ISO/IEC 14882:2011):
  • 7.6.4 Atributo de dependencia de transporte [dcl.attr.depend]

Véase también

alignof (C++11) consulta los requisitos de alineación de un tipo
(operador)
obtiene los requisitos de alineación del tipo
(plantilla de clase)
Documentación de C para _Alignas, alignas