Namespaces
Variants

alignas specifier (since C++11)

From cppreference.net
C++ language
General topics
Flow control
Conditional execution statements
Iteration statements (loops)
Jump statements
Functions
Function declaration
Lambda function expression
inline specifier
Dynamic exception specifications ( until C++17* )
noexcept specifier (C++11)
Exceptions
Namespaces
Types
Specifiers
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Storage duration specifiers
Initialization
Expressions
Alternative representations
Literals
Boolean - Integer - Floating-point
Character - String - nullptr (C++11)
User-defined (C++11)
Utilities
Attributes (C++11)
Types
typedef declaration
Type alias declaration (C++11)
Casts
Memory allocation
Classes
Class-specific function properties
Special member functions
Templates
Miscellaneous

Gibt die Ausrichtungsanforderung eines Typs oder eines Objekts an.

Inhaltsverzeichnis

Syntax

alignas( Ausdruck )
alignas( Typ-ID )
alignas( Paket ... )
1) expression muss ein integral constant expression sein, das zu null oder zu einem gültigen Wert für eine alignment oder erweiterte alignment ausgewertet wird.
2) Entspricht alignas ( alignof ( type-id ) ) .
3) Entspricht mehreren alignas-Spezifizierern, die auf dieselbe Deklaration angewendet werden, jeweils für jedes Element des parameter pack , das entweder ein Typ- oder Konstanten-Parameterpack sein kann.

Erklärung

Der alignas Spezifizierer kann angewendet werden auf:

  • die Deklaration oder Definition einer class ;
  • die Deklaration eines non-bitfield class data members;
  • die Deklaration einer Variable, außer dass sie nicht auf Folgendes angewendet werden kann:
    • einen Funktionsparameter;
    • den Exception-Parameter einer catch-Klausel.

Das Objekt oder der Typ, der durch eine solche Deklaration deklariert wird, hat seine Ausrichtungsanforderung gleich der strengsten (größten) Nicht-Null- Expression aller alignas Spezifizierer, die in der Deklaration verwendet werden, es sei denn, dies würde die natürliche Ausrichtung des Typs schwächen.

Wenn die strengste (größte) alignas -Angabe in einer Deklaration schwächer ist als die Ausrichtung, die sie ohne jegliche alignas -Spezifizierer hätte (das heißt, schwächer als ihre natürliche Ausrichtung oder schwächer als alignas in einer anderen Deklaration desselben Objekts oder Typs), ist das Programm fehlerhaft:

struct alignas(8) S {};
struct alignas(1) U { S s; }; // Fehler: Ausrichtung von U wäre 8 ohne alignas(1)

Ungültige Nicht-Null-Ausrichtungen, wie alignas ( 3 ) sind fehlerhaft.

Gültige Nicht-Null-Ausrichtungen, die schwächer als eine andere alignas in derselben Deklaration sind, werden ignoriert.

alignas ( 0 ) wird immer ignoriert.

Hinweise

Gemäß dem ISO-C11-Standard verfügt die Sprache C über das _Alignas Schlüsselwort und definiert alignas als Präprozessor-Makro, das in der Header-Datei <stdalign.h> zum Schlüsselwort expandiert.

In C++, dies ist ein Schlüsselwort, und

die Header <stdalign.h> und <cstdalign> definieren kein solches Makro. Sie definieren jedoch die Makrokonstante __alignas_is_defined .

(bis C++20)

der Header <stdalign.h> definiert kein solches Makro. Er definiert jedoch die Makrokonstante __alignas_is_defined .

(seit C++20)

Schlüsselwörter

alignas

Beispiel

#include <iostream>
// Jedes Objekt vom Typ struct_float wird
// an alignof(float)-Grenze ausgerichtet (üblicherweise 4):
struct alignas(float) struct_float
{
    // Ihre Definition hier
};
// Jedes Objekt vom Typ sse_t wird an 32-Byte-Grenze ausgerichtet:
struct alignas(32) sse_t
{
    float sse_data[4];
};
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'
        << std::hex << std::showbase
        << "&a: " << &a << "\n"
           "&b: " << &b << "\n"
           "&c: " << &c << "\n"
           "&x: " << &x << "\n"
           "&y: " << &y << "\n"
           "&z: " << &z << '\n';
}

Mögliche Ausgabe:

alignof(struct_float) = 4
sizeof(sse_t) = 32
alignof(sse_t) = 32
&a: 0x7fffcec89930
&b: 0x7fffcec89940
&c: 0x7fffcec89950
&x: 0x7fffcec89960
&y: 0x7fffcec89980
&z: 0x7fffcec899a0

Fehlerberichte

Die folgenden verhaltensändernden Fehlerberichte wurden rückwirkend auf zuvor veröffentlichte C++-Standards angewendet.

DR Angewendet auf Verhalten wie veröffentlicht Korrektes Verhalten
CWG 1437 C++11 alignas konnte in Alias-Deklarationen verwendet werden verboten
CWG 2354 C++11 alignas konnte auf die Deklaration einer Enumeration angewendet werden verboten

Referenzen

  • C++23-Standard (ISO/IEC 14882:2024):
  • 9.12.4 Carries dependency-Attribut [dcl.attr.depend]
  • C++20-Standard (ISO/IEC 14882:2020):
  • 9.12.3 Trägt-Abhängigkeits-Attribut [dcl.attr.depend]
  • C++17-Standard (ISO/IEC 14882:2017):
  • 10.6.3 Carries dependency-Attribut [dcl.attr.depend]
  • C++14-Standard (ISO/IEC 14882:2014):
  • 7.6.4 Carries dependency-Attribut [dcl.attr.depend]
  • C++11-Standard (ISO/IEC 14882:2011):
  • 7.6.4 Carries dependency-Attribut [dcl.attr.depend]

Siehe auch

alignof (C++11) fragt die Ausrichtungsanforderungen eines Typs ab
(Operator)
ermittelt die Ausrichtungsanforderungen des Typs
(Klassentemplate)
C-Dokumentation für _Alignas, alignas