Namensräume
Varianten
Aktionen

_Alignas (seit C11)(veraltet in C23), alignas (seit C23)

Von cppreference.com
< c‎ | Sprache

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 _Alignas ist auch als praktisches Makro alignas verfügbar, das in der Headerdatei <stdalign.h> enthalten ist.

(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

1,2) das Ergebnis des Ausdrucks gesetzt, sofern dieser nicht Null ist
3,4) die Ausrichtungsanforderung des Typs gesetzt, d.h. auf _Alignof(Typ)(bis C23)alignof(Typ)(seit C23)

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

alignas, _Alignas

[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

ein Typ mit einer Ausrichtungsanforderung, die so groß ist wie bei jedem anderen Skalartyp
(typedef) [bearbeiten]
_Alignof(bis C23)alignof(seit C23) fragt nach den Ausrichtungsanforderungen eines Objekts ab
(Operator)
C++-Dokumentation für alignas-Spezifizierer