Namensräume
Varianten
Aktionen

alignas-Spezifizierer (seit C++11)

Von cppreference.com
< cpp‎ | Sprache
 
 
C++ Sprache
Allgemeine Themen
Kontrollfluss
Bedingte Ausführungsaussagen
if
Iterationsanweisungen (Schleifen)
for
Bereichs-for (C++11)
Sprunganweisungen
Funktionen
Funktionsdeklaration
Lambda-Funktionsausdruck
inline-Spezifizierer
Dynamische Ausnahmespezifikationen (bis C++17*)
noexcept-Spezifizierer (C++11)
Ausnahmen
Namensräume
Typen
Spezifizierer
const/volatile
decltype (C++11)
auto (C++11)
constexpr (C++11)
consteval (C++20)
constinit (C++20)
Speicherdauer-Spezifizierer
Initialisierung
Ausdrücke
Alternative Darstellungen
Literale
Boolesch - Ganzzahl - Gleitkommazahl
Zeichen - String - nullptr (C++11)
Benutzerdefinierte (C++11)
Dienstprogramme
Attribute (C++11)
Typen
typedef-Deklaration
Typalias-Deklaration (C++11)
Umwandlungen
Speicherzuweisung
Klassen
Klassenspezifische Funktionseigenschaften
explicit (C++11)
static

Spezielle Member-Funktionen
Templates
Sonstiges
 
 

Gibt die Ausrichtungsanforderung eines Typs oder eines Objekts an.

Inhalt

[bearbeiten] Syntax

alignas( Ausdruck )
alignas( Typ-ID )
alignas( Pack ... )
1) Der Ausdruck muss ein integraler Konstantenausdruck sein, der zu Null oder zu einem gültigen Wert für eine Ausrichtung oder erweiterte Ausrichtung ausgewertet wird.
2) Entspricht alignas(alignof( Typ-ID )).
3) Entspricht mehreren alignas-Spezifizierern, die auf dieselbe Deklaration angewendet werden, einem für jedes Element des Parameter-Packs, welches ein Typ- oder Nicht-Typ-Parameter-Pack sein kann.

[bearbeiten] Erklärung

Der alignas-Spezifizierer kann angewendet werden auf

  • die Deklaration oder Definition einer Klasse;
  • die Deklaration eines nicht-Bitfeld-Klassen-Datenmembers;
  • die Deklaration einer Variablen, außer dass er nicht auf Folgendes angewendet werden kann
    • einen Funktionsparameter;
    • den Ausnahme-Parameter einer catch-Klausel.

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

Wenn das strengste (größte) alignas einer Deklaration schwächer ist als die Ausrichtung, die sie ohne alignas-Spezifizierer hätte (d.h. schwächer als ihre natürliche Ausrichtung oder schwächer als alignas einer anderen Deklaration desselben Objekts oder Typs), ist das Programm ill-formed.

struct alignas(8) S {};
struct alignas(1) U { S s; }; // error: alignment of U would have been 8 without alignas(1)

Ungültige nicht-null-Ausrichtungen, wie z.B. alignas(3), sind ill-formed.

Gültige nicht-null-Ausrichtungen, die schwächer sind als ein anderes alignas in derselben Deklaration, werden ignoriert.

alignas(0) wird immer ignoriert.

[bearbeiten] Hinweise

Gemäß dem ISO C11-Standard hat die C-Sprache das Schlüsselwort _Alignas und definiert alignas als Makro, das auf das Schlüsselwort in der Header-Datei <stdalign.h> erweitert wird.

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

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

(bis C++20)

die Header-Datei <stdalign.h> definiert kein solches Makro. Sie definiert jedoch die Makrokonstante __alignas_is_defined.

(seit C++20)

[bearbeiten] Schlüsselwörter

alignas

[bearbeiten] Beispiel

#include <iostream>
 
// Every object of type struct_float will be aligned
// to alignof(float) boundary (usually 4):
struct alignas(float) struct_float
{
    // your definition here
};
 
// Every object of type sse_t will be aligned to 32-byte boundary:
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

[bearbeiten] Fehlerberichte

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

DR angewendet auf Verhalten wie veröffentlicht Korrigiertes Verhalten
CWG 1437 C++11 alignas konnte in Alias-Deklarationen verwendet werden verboten
CWG 2354 C++11 alignas konnte auf die Deklaration einer Aufzählung angewendet werden verboten

[bearbeiten] Referenzen

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

[bearbeiten] Siehe auch

alignof (C++11) fragt nach Ausrichtungsanforderungen eines Typs
(Operator)[bearbeiten]
erhält die Ausrichtungsvoraussetzungen des Typs
(Klassenvorlage) [bearbeiten]
C-Dokumentation für _Alignas, alignas