Especificador alignas (desde C++11)
Especifica el requisito de alineación de un tipo u objeto.
Sintaxis
alignas( expresión )
|
|||||||||
alignas( id-de-tipo )
|
|||||||||
alignas( paquete ... )
|
|||||||||
alignas(expresión) debe ser una expresión constante entera que se evalúa como cero, o un valor válido de alineamiento o alineamiento extendido.alignas(alignof(type))Explicación
El especificador alignas se puede aplicar a:
- la declaración o definición de una clase/struct/unión o enumeración;
- la declaración de un dato miembro de clase que no sea un campo de bits;
- la declaración de una variable, aunque no se puede aplicar a:
- un parámetro de función;
- el parámetro de excepción en una cláusula
catch.
El objeto o tipo declarado por dicha declaración tendrá su requisito de alineación igual a la expresión más estricta (la mayor) distinta de cero de todos los especificadores alignas usados en la declaración, siempre que no debilite la alineación natural del tipo.
Si el alignas más estricto (mayor) en la 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 de 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 hubiera sido 8 sin alignas(1)
Las alineaciones distintas de cero, como alignas(3) están mal formadas.
Se ignoran las alineaciones válidas distintas de cero que son más débiles que otros alignas en la misma declaración.
Siempre se ignora alignas(0).
Notas
A partir de la norma 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 la cabecera <stdalign.h>.
En C++, esta es una palabra clave, y
|
los encabezados <stdalign.h> y <cstdalign> no definen esta macro. Sin embargo, definen la constante de macro |
(hasta C++20) |
|
el encabezado <stdalign.h> no define esta macro. Sin embargo define la constante de macro |
(desde C++20) |
Palabras clave
Ejemplo
// cada objeto de tipo struct_float será alineado con el límite alignof(float)
// (normalmente 4):
struct alignas(float) struct_float
{
// su definición aqui
};
// cada objeto de tipo sse_t will será alineado en un límite de 32 bytes:
struct alignas(32) sse_t
{
float sse_data[4];
};
// el array "cacheline" será alineado con el límite de 64 bytes:
alignas(64) char cacheline[64];
#include <iostream>
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'
<< "alignof(cacheline) = " << alignof(alignas(64) char[64]) << '\n'
<< std::hex << std::showbase
<< "&a: " << &a << '\n'
<< "&b: " << &b << '\n'
<< "&c: " << &c << '\n'
<< "&x: " << &x << '\n'
<< "&y: " << &y << '\n'
<< "&z: " << &z << '\n';
}
Posible salida:
alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
alignof(cacheline) = 64
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0
Véase también
operador alignof(C++11)
|
Consulta los requerimientos de alineación de un tipo (desde C++11) |
(C++11) |
Obtiene los requisitos de alineación del tipo (plantilla de clase) |
Documentación de C para _Alignas
| |