2015-11-11 20 views
8

In C, gibt es eine Möglichkeit, über den Stapelspeicher (d. H. Mehr Ausrichtung, als aus dem Typsystem abgeleitet werden kann) zu bekommen?Äquivalent von std :: aligned_storage <> in C?

Für Variablen in dynamisch zugewiesenen Speicher können wir immer manuell ausrichten, wenn alles andere fehlschlägt, aber was kann für Variablen in automatisch zugewiesenen Speicher getan werden?

Ich denke, es ist möglich, eine char[size + alignment - 1] zu verwenden und dann immer Bit-Manipulation verwenden, um auf die Variable zuzugreifen, aber dies scheint ein "bisschen" schattiger als notwendig (har har har;)).

+0

Haben Sie _Alignas Specifier versucht? – this

+0

@this oops, ich hätte erwähnen sollen, nein C11, danke – Praxeolitic

+0

Warum haben Sie die andere Antwort akzeptiert, wenn C11 keine Option war? :-( – this

Antwort

5

In C2011 gibt es die _Alignas und _Alignof Schlüsselwörter, den Kopf <stdalign.h>, die ihre Verwendung etwas weniger hässlich macht, und die Art max_align_t (die in <stddef.h> ist). Sie können zum Beispiel schreiben

double _Alignas(4*_Alignof(double)) dvector[16]; 

ein Array von 16 double Mengen anzufordern ausgerichtet die übliche Ausrichtung für double 4x, wie es für die Verwendung mit einer CPU-spezifischen Vektorbefehle erforderlich sein. Das funktioniert nicht bei allen Implementierungen, aber wenn es nicht funktioniert, ist es garantiert ein Kompilierungsfehler.

Vor C2011 gab es keinen Standard Weg, dies zu tun, aber viele Compiler hatten Erweiterungen mit ähnlicher Funktionalität, z.B. GCC's __attribute__ (aligned) Konstrukt.

5

Gut Gewerkschaften in den Sinn kommen.

union This 
{ 
    int integer; 
    align_type alignment; 
} ; 

Es gibt keine Auffüllung vor Mitgliedern in Vereinigungen. Wenn Sie also eine automatische Variable union This deklarieren, sollten sie und alle ihre Elemente genauso ausgerichtet sein wie die Ausrichtung des Elements mit der höchsten Ausrichtung.

Verwandte Themen