alignas-Spezifizierer (seit C++11)
Gibt die Ausrichtungsanforderung eines Typs oder eines Objekts an.
Inhalt |
[bearbeiten] Syntax
alignas( Ausdruck ) |
|||||||||
alignas( Typ-ID ) |
|||||||||
alignas( Pack ... ) |
|||||||||
[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
[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) |
| (C++11) |
erhält die Ausrichtungsvoraussetzungen des Typs (Klassenvorlage) |
| C-Dokumentation für _Alignas, alignas
| |