Gibt es in C eine Möglichkeit, den Speicher auf dem Stack zu überfliegen (d. h. mehr Ausrichtung als aus dem Typsystem abzuleiten)?
Bei Variablen in dynamisch zugewiesenem Speicher können wir immer manuell ausrichten, wenn alles andere fehlschlägt, aber was kann für Variablen in automatisch zugewiesenem Speicher getan werden?
Ich denke, es ist möglich, ein char[size + alignment - 1]
zu verwenden und dann immer Bit-Manipulation zu verwenden, um auf die Variable zuzugreifen, aber dies scheint ein "bisschen" schattiger als notwendig (har har har;)).
In C2011 gibt es die _Alignas
und _Alignof
Schlüsselwörter, die Kopfzeile <stdalign.h>
, die ihre Verwendung etwas weniger hässlich macht, und der Typ max_align_t
(was in <stddef.h>
ist). Sie können zum Beispiel
um ein Array von 16 double
-Mengen anzufordern, das auf 4x der üblichen Ausrichtung für double
ausgerichtet ist, wie es für die Verwendung mit CPU-spezifischen Vektorbefehlen erforderlich sein könnte. Es kann nicht garantiert werden, dass es bei allen Implementierungen funktioniert, aber wenn es nicht funktioniert, ist es garantiert ein Fehler bei der Kompilierung.
Vor C2011 gab es keinen Standard Weg, dies zu tun, aber viele Compiler hatten Erweiterungen mit ähnlicher Funktionalität, z.B. GCC __attribute__ (aligned)
Konstrukt.
Gut Gewerkschaften kommen mir in den Sinn.
%Vor% Es gibt keine Auffüllung vor Mitgliedern in Vereinigungen. Wenn Sie also eine automatische Variable union This
deklarieren, sollten sie und alle ihre Mitglieder genauso ausgerichtet sein wie die Ausrichtung des Elements mit der höchsten Ausrichtung.