alignas
specifier
(since C++11)
Gibt die Ausrichtungsanforderung eines Typs oder eines Objekts an.
Inhaltsverzeichnis |
Syntax
alignas(
Ausdruck
)
|
|||||||||
alignas(
Typ-ID
)
|
|||||||||
alignas(
Paket
...
)
|
|||||||||
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
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) |
|
(C++11)
|
ermittelt die Ausrichtungsanforderungen des Typs
(Klassentemplate) |
|
C-Dokumentation
für
_Alignas, alignas
|
|