_Alignas (seit C11)(veraltet in C23), alignas (seit C23)
Erscheint in der Deklarationssyntax als einer der Typenspezifizierer, um die Ausrichtungsanforderung des deklarierten Objekts zu modifizieren.
Inhalt |
[edit] Syntax
_Alignas ( Ausdruck ) |
(1) | (seit C11) | |||||||
alignas ( Ausdruck ) |
(2) | (seit C23) | |||||||
_Alignas ( Typ ) |
(3) | (seit C11) | |||||||
alignas ( Typ ) |
(4) | (seit C23) | |||||||
| expression | - | beliebiger konstanter ganzzahliger Ausdruck, dessen Wert eine gültige Ausrichtung oder Null ist |
| type | - | beliebiger Typname |
|
Das Schlüsselwort |
(bis C23) |
[edit] Erklärung
Der Spezifizierer _Alignas(bis C23)alignas(seit C23) kann nur bei der Deklaration von Objekten verwendet werden, die keine Bitfelder sind und nicht die Speicherklasse register haben. Er kann nicht in Funktionsparameterdeklarationen und nicht in einem typedef verwendet werden.
Wenn er in einer Deklaration verwendet wird, wird die Ausrichtungsanforderung des deklarierten Objekts auf
gesetzt, außer wenn dies die Ausrichtung, die der Typ von Natur aus hätte, abschwächen würde.
Wenn der Ausdruck zu Null ausgewertet wird, hat dieser Spezifizierer keine Auswirkung.
Wenn mehrere _Alignas(bis C23)alignas(seit C23)-Spezifizierer in derselben Deklaration erscheinen, wird der strengste verwendet.
Der _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 die gleiche Ausrichtung angeben wie die _Alignas(bis C23)alignas(seit C23) in der Definition. Das Verhalten ist undefiniert, wenn verschiedene Übersetzungseinheiten unterschiedliche Ausrichtungen für dasselbe Objekt angeben.
[edit] Anmerkungen
In C++ kann der alignas-Spezifizierer auch auf Deklarationen von Klassen-/Struktur-/Union-Typen und Aufzählungen angewendet werden. Dies wird in C nicht unterstützt, aber die Ausrichtung eines Strukturtyps kann durch die Verwendung von _Alignas(bis C23)alignas(seit C23) in einer Memberdeklaration gesteuert werden.
[edit] Schlüsselwörter
[edit] 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
[edit] Fehlerberichte
Die folgenden verhaltensändernden Defect Reports 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 |
[edit] Referenzen
- C23-Standard (ISO/IEC 9899:2024)
- 6.7.5 Alignment specifier (p: TBD)
- 6.2.8 Alignment of objects (p: TBD)
- 7.15 Alignment <stdalign.h> (p: TBD)
- C17-Standard (ISO/IEC 9899:2018)
- 6.7.5 Alignment specifier (p: 92)
- 6.2.8 Alignment of objects (p: 36-37)
- 7.15 Alignment <stdalign.h> (p: 196)
- C11-Standard (ISO/IEC 9899:2011)
- 6.7.5 Alignment specifier (p: 127-128)
- 6.2.8 Alignment of objects (p: 48-49)
- 7.15 Alignment <stdalign.h> (p: 268)
[edit] Siehe auch
| (C11) |
ein Typ mit einer Ausrichtungsanforderung, die so groß ist wie bei jedem anderen Skalartyp (typedef) |
| _Alignof(bis C23)alignof(seit C23) | fragt nach den Ausrichtungsanforderungen eines Objekts ab (Operator) |
| C++-Dokumentation für
alignas-Spezifizierer | |