alignas
(C++)
L'identificatore alignas
modifica l'allineamento di un tipo o di un oggetto in memoria.
Sintassi
alignas(expression)
alignas(type-id)
alignas(pack...)
Osservazioni:
È possibile usare l'identificatore alignas
in una struct
dichiarazione di variabile , class
union
, o .
Per alignas(expression)
, l'espressione deve essere un'espressione costante integrale che è 0 o una potenza di 2 (1, 2, 4, 8, 16, ...). Tutte le altre espressioni non sono formate.
Usare alignas
anziché __declspec(align(#))
per la portabilità del codice.
Un uso comune di è quello di alignas
controllare l'allineamento di un tipo definito dall'utente, come illustrato nell'esempio seguente:
struct alignas(8) S1
{
int x;
};
static_assert(alignof(S1) == 8, "alignof(S1) should be 8");
Quando più alignas
vengono applicate alla stessa dichiarazione, viene usata quella con il valore più grande. Il alignas
valore di 0
viene ignorato.
L'esempio seguente illustra come usare alignas
con un tipo definito dall'utente:
class alignas(4) alignas(16) C1 {};
// `alignas(0)` ignored
union alignas(0) U1
{
int i;
float f;
};
union U2
{
int i;
float f;
};
static_assert(alignof(C1) == 16, "alignof(C1) should be 16");
static_assert(alignof(U1) == alignof(U2), "alignof(U1) should be equivalent to alignof(U2)");
È possibile specificare un tipo come valore di allineamento. L'allineamento predefinito del tipo viene usato come valore di allineamento, come illustrato nell'esempio seguente:
struct alignas(double) S2
{
int x;
};
static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");
Un pacchetto di parametri modello (alignas (pack...)
) può essere usato per il valore di allineamento. Viene utilizzato il valore di allineamento più grande di tutti gli elementi del pacchetto.
template <typename... Ts>
class alignas(Ts...) C2
{
char c;
};
static_assert(alignof(C2<>) == 1, "alignof(C2<>) should be 1");
static_assert(alignof(C2<short, int>) == 4, "alignof(C2<short, int>) should be 4");
static_assert(alignof(C2<int, float, double>) == 8, "alignof(C2<int, float, double>) should be 8");
Se vengono applicati più alignas
valori, l'allineamento risultante è il più grande di tutti i alignas
valori e non può essere minore dell'allineamento naturale del tipo a cui viene applicato.
La dichiarazione e la definizione di tipi definiti dall'utente devono avere lo stesso valore di allineamento.
// Declaration of `C3`
class alignas(16) C3;
// Definition of `C3` with differing alignment value
class alignas(32) C3 {}; // Error: C2023 'C3': Alignment (32) different from prior declaration (16)
int main()
{
alignas(2) int x; // ill-formed because the natural alignment of int is 4
}
Vedi anche
#pragma pack
Allineamento
alignof
Errore del compilatore C2023
Avviso del compilatore C4359
Commenti e suggerimenti
https://aka.ms/ContentUserFeedback.
Presto disponibile: Nel corso del 2024 verranno gradualmente disattivati i problemi di GitHub come meccanismo di feedback per il contenuto e ciò verrà sostituito con un nuovo sistema di feedback. Per altre informazioni, vedereInvia e visualizza il feedback per