Bagikan melalui


alignas (C++)

Penentu alignas mengubah perataan jenis atau objek dalam memori.

Sintaks

alignas(expression)
alignas(type-id)
alignas(pack...)

Keterangan

Anda dapat menggunakan alignas penentu structpada deklarasi variabel , class, union, atau .

Untuk alignas(expression), ekspresi harus berupa ekspresi konstanta integral yaitu 0 atau kekuatan 2 (1, 2, 4, 8, 16, ...). Semua ekspresi lainnya tidak terbentuk.

Gunakan alignas alih-alih __declspec(align(#)) untuk portabilitas kode.

Penggunaan alignas umum adalah mengontrol perataan jenis yang ditentukan pengguna, seperti yang ditunjukkan dalam contoh berikut:

struct alignas(8) S1
{
    int x;
};

static_assert(alignof(S1) == 8, "alignof(S1) should be 8");

Ketika beberapa alignas diterapkan ke deklarasi yang sama, satu dengan nilai terbesar digunakan. Nilai alignas0 diabaikan.

Contoh berikut menunjukkan cara menggunakan alignas dengan jenis yang ditentukan pengguna:

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)");

Anda dapat menyediakan jenis sebagai nilai perataan. Perataan default jenis digunakan sebagai nilai perataan, seperti yang ditunjukkan dalam contoh berikut:

struct alignas(double) S2
{
    int x;
};

static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");

Paket parameter templat (alignas (pack...)) dapat digunakan untuk nilai perataan. Nilai perataan terbesar dari semua elemen dalam paket digunakan.

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");

Jika beberapa alignas diterapkan, perataan yang dihasilkan adalah yang terbesar dari semua alignas nilai, dan tidak boleh kurang dari perataan alami dari jenis yang diterapkannya.

Deklarasi dan definisi jenis yang ditentukan pengguna harus memiliki nilai perataan yang sama.

// 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
}

Baca juga

#pragma pack
Alignment
alignof
Kesalahan pengkompilasi C2023
Peringatan kompilator C4359