Condividi tramite


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 structdichiarazione di variabile , classunion, 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