Es ist C-Sprache. Es steht geschrieben, dass:
typedef struct __attribute__((packed, aligned(4))) Ball {
float2 delta;
float2 position;
//float3 color;
float size;
//int arcID;
//float arcStr;
} Ball_t;
Ball_t *balls;
Bitte sagen Sie mir, was das bedeutet und wie Sie dieses Schlüsselwort verwenden.
aligned(4)
Sie sich wahrscheinlich nicht viel Sorgen machen müssen.Antworten:
Bevor ich antworte, möchte ich Ihnen einige Daten aus dem Wiki geben
Die Datenstrukturausrichtung ist die Art und Weise, wie Daten im Computerspeicher angeordnet und abgerufen werden. Es besteht aus zwei getrennten, aber verwandten Themen: Datenausrichtung und Auffüllen der Datenstruktur .
Wenn ein moderner Computer von einer Speicheradresse liest oder in diese schreibt, geschieht dies in wortgroßen Blöcken (z. B. 4-Byte-Blöcken auf einem 32-Bit-System). Datenausrichtung bedeutet, dass die Daten auf einen Speicherversatz gesetzt werden, der einem Vielfachen der Wortgröße entspricht, was die Systemleistung aufgrund der Art und Weise erhöht, wie die CPU mit Speicher umgeht.
Um die Daten auszurichten, müssen möglicherweise einige bedeutungslose Bytes zwischen dem Ende der letzten Datenstruktur und dem Beginn der nächsten Daten eingefügt werden . Dies ist das Auffüllen der Datenstruktur .
gcc bietet Funktionen zum Deaktivieren des Strukturauffüllens. dh um diese bedeutungslosen Bytes in einigen Fällen zu vermeiden. Betrachten Sie die folgende Struktur:
sizeof(sSampleStruct)
wird 12 statt 8 sein. Wegen der Strukturauffüllung. In X86 werden Strukturen standardmäßig auf 4-Byte-Ausrichtung aufgefüllt:Wir können verwenden
__attribute__((packed, aligned(X)))
, um auf einer bestimmten (X) Größe Polsterung zu bestehen. X sollte Zweierpotenzen sein. Siehe hierDas oben angegebene gcc-Attribut erlaubt daher keine Strukturauffüllung. Die Größe beträgt also 8 Bytes.
Wenn Sie dasselbe für alle Strukturen tun möchten, können wir einfach den Ausrichtungswert zum Stapeln mit verschieben
#pragma
quelle
packed
bedeutet, dass es den kleinstmöglichen Platz fürstruct Ball
- dh es wird Felder ohne Polsterung zusammenpressenaligned
bedeutet, dass jederstruct Ball
an einer 4-Byte-Grenze beginnt - dh für jedestruct Ball
kann seine Adresse durch 4 geteilt werdenDies sind GCC-Erweiterungen, die nicht Teil eines C-Standards sind.
quelle
Das Attribut
packed
bedeutet, dass der Compiler keine Auffüllung zwischen den Feldern desstruct
. Das Auffüllen wird normalerweise verwendet, um Felder an ihrer natürlichen Größe auszurichten, da einige Architekturen Strafen für nicht ausgerichteten Zugriff vorsehen oder dies überhaupt nicht zulassen.aligned(4)
bedeutet, dass die Struktur an einer Adresse ausgerichtet werden sollte, die durch 4 teilbar ist.quelle