_Alignas (since C11) (deprecated in C23) , alignas (since C23)
Erscheint in der Deklaration Syntax als einer der Typspezifizierer, um die Ausrichtungsanforderung des deklarierten Objekts zu modifizieren.
Inhaltsverzeichnis |
Syntax
_Alignas
(
expression
)
|
(1) | (seit C11) | |||||||
alignas
(
expression
)
|
(2) | (seit C23) | |||||||
_Alignas
(
type
)
|
(3) | (seit C11) | |||||||
alignas
(
type
)
|
(4) | (seit C23) | |||||||
| expression | - | jede Integer-Konstantenexpression deren Wert eine gültige Ausrichtung oder null ist |
| type | - | jeder Typname |
|
Das Schlüsselwort
|
(bis C23) |
Erklärung
Der
_Alignas
(bis C23)
alignas
(seit C23)
Spezifizierer kann nur bei der Deklaration von Objekten verwendet werden, die keine
Bitfelder
sind und nicht die
register
Speicherklasse besitzen. Er kann nicht in Funktionsparameterdeklarationen verwendet werden und nicht in einem typedef.
Bei Verwendung in einer Deklaration wird das deklarierte Objekt seine Ausrichtungsanforderung auf folgendes gesetzt haben:
außer wenn dies die Ausrichtung schwächen würde, die der Typ natürlicherweise gehabt hätte.
Wenn expression zu Null ausgewertet wird, hat dieser Spezifizierer keine Wirkung.
Wenn mehrere
_Alignas
(bis C23)
alignas
(seit C23)
Spezifizierer in derselben Deklaration erscheinen, wird der strengste verwendet.
_Alignas
(bis C23)
alignas
(seit C23)
Spezifizierer muss nur in der
Definition
eines Objekts erscheinen, aber wenn eine Deklaration
_Alignas
(bis C23)
alignas
(seit C23)
verwendet, muss sie dieselbe Ausrichtung angeben wie der
_Alignas
(bis C23)
alignas
(seit C23)
in der Definition. Das Verhalten ist undefiniert, wenn verschiedene Übersetzungseinheiten unterschiedliche Ausrichtungen für dasselbe Objekt angeben.
Hinweise
In C++ kann der
alignas
-Spezifizierer auch auf die Deklarationen von Klassen-/Struct-/Union-Typen und Enumerationen angewendet werden. Dies wird in C nicht unterstützt, jedoch kann die Ausrichtung eines Struct-Typs durch Verwendung von
_Alignas
(bis C23)
alignas
(seit C23)
in einer Mitgliederdeklaration gesteuert werden.
Schlüsselwörter
Beispiel
#include <stdalign.h> #include <stdio.h> // every object of type struct sse_t will be aligned to 16-byte boundary // (note: needs support for DR 444) struct sse_t { alignas(16) float sse_data[4]; }; // every object of type struct data will be aligned to 128-byte boundary struct data { char x; alignas(128) char cacheline[128]; // over-aligned array of char, // not array of over-aligned chars }; int main(void) { printf("sizeof(data) = %zu (1 byte + 127 bytes padding + 128-byte array)\n", sizeof(struct data)); printf("alignment of sse_t is %zu\n", alignof(struct sse_t)); alignas(2048) struct data d; // this instance of data is aligned even stricter (void)d; // suppresses "maybe unused" warning }
Ausgabe:
sizeof(data) = 256 (1 byte + 127 bytes padding + 128-byte array) alignment of sse_t is 16
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 |
|---|---|---|---|
| DR 444 | C11 |
_Alignas
war in Struktur- und Union-Mitgliedern nicht erlaubt
|
erlaubt |
Referenzen
- C23-Standard (ISO/IEC 9899:2024):
-
- 6.7.5 Ausrichtungsspezifizierer (S.: TBD)
-
- 6.2.8 Ausrichtung von Objekten (S.: TBD)
-
- 7.15 Ausrichtung <stdalign.h> (S.: TBD)
- C17-Standard (ISO/IEC 9899:2018):
-
- 6.7.5 Ausrichtungsspezifizierer (S: 92)
-
- 6.2.8 Ausrichtung von Objekten (S: 36-37)
-
- 7.15 Ausrichtung <stdalign.h> (S: 196)
- C11-Standard (ISO/IEC 9899:2011):
-
- 6.7.5 Ausrichtungsspezifizierer (S: 127-128)
-
- 6.2.8 Ausrichtung von Objekten (S: 48-49)
-
- 7.15 Ausrichtung <stdalign.h> (S: 268)
Siehe auch
|
(C11)
|
ein Typ mit Ausrichtungsanforderung so groß wie jeder andere skalare Typ
(typedef) |
| _Alignof (bis C23) alignof (seit C23) |
fragt Ausrichtungsanforderungen eines Objekts ab
(Operator) |
|
C++-Dokumentation
für
alignas
-Spezifizierer
|
|