alignas
(C++)
Le alignas
spécificateur modifie l’alignement d’un type ou d’un objet en mémoire.
Syntaxe
alignas(expression)
alignas(type-id)
alignas(pack...)
Notes
Vous pouvez utiliser alignas
le spécificateur sur une struct
déclaration de variable, ou union
un , class
Pour alignas(expression)
, l’expression doit être une expression constante intégrale qui est 0 ou une puissance de 2 (1, 2, 4, 8, 16, ...). Toutes les autres expressions sont mal formées.
Utilisez alignas
plutôt que pour la portabilité du __declspec(align(#))
code.
Une utilisation alignas
courante consiste à contrôler l’alignement d’un type défini par l’utilisateur, comme illustré dans l’exemple suivant :
struct alignas(8) S1
{
int x;
};
static_assert(alignof(S1) == 8, "alignof(S1) should be 8");
Lorsque plusieurs alignas
sont appliqués à la même déclaration, celui dont la valeur est la plus élevée est utilisée. La alignas
valeur est 0
ignorée.
L’exemple suivant montre comment utiliser alignas
avec un type défini par l’utilisateur :
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)");
Vous pouvez fournir un type comme valeur d’alignement. L’alignement par défaut du type est utilisé comme valeur d’alignement, comme illustré dans l’exemple suivant :
struct alignas(double) S2
{
int x;
};
static_assert(alignof(S2) == alignof(double), "alignof(S2) should be equivalent to alignof(double)");
Un pack de paramètres de modèle (alignas (pack...)
) peut être utilisé pour la valeur d’alignement. La plus grande valeur d’alignement de tous les éléments du pack est utilisée.
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");
Si plusieurs alignas
sont appliqués, l’alignement obtenu est le plus grand de toutes les alignas
valeurs et ne peut pas être inférieur à l’alignement naturel du type auquel il est appliqué.
La déclaration et la définition des types définis par l’utilisateur doivent avoir la même valeur d’alignement.
// 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
}
Voir aussi
#pragma pack
Alignment
alignof
Erreur du compilateur C2023
Avertissement du compilateur C4359
Commentaires
https://aka.ms/ContentUserFeedback.
Bientôt disponible : Tout au long de 2024, nous allons supprimer progressivement GitHub Issues comme mécanisme de commentaires pour le contenu et le remplacer par un nouveau système de commentaires. Pour plus d’informations, consultezEnvoyer et afficher des commentaires pour