Namespaces
Variants

_Alignas (since C11) (deprecated in C23) , alignas (since C23)

From cppreference.net

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 _Alignas ist auch als praktisches Makro alignas verfügbar, erhältlich im Header <stdalign.h> .

(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:

1,2) das Ergebnis des Ausdrucks , sofern es nicht null ist
3,4) die Ausrichtungsanforderung des type , also _Alignof ( type ) (bis C23) alignof ( type ) (seit C23)

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

alignas , _Alignas

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

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