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 es bedeutet und wie Sie dieses Schlüsselwort verwenden.
Bevor ich antworte, möchte ich Ihnen einige Daten aus dem Wiki geben
Ausrichtung der Datenstruktur ist die Art und Weise, wie Daten im Computerspeicher angeordnet und abgerufen werden. Es besteht aus zwei getrennten, aber zusammenhängenden Themen: Datenabgleich und Auffüllen von Datenstrukturen.
Wenn ein moderner Computer von einer Speicheradresse liest oder in eine Speicheradresse schreibt, tut er dies in wortgroßen Blöcken (z. B. 4-Byte-Blöcke auf einem 32-Bit-System). Datenabgleich bedeutet, dass die Daten an einem Speicher-Offset platziert werden, der einem Vielfachen der Wortgröße entspricht, was die Systemleistung aufgrund der Art und Weise erhöht, wie die CPU den Speicher verarbeitet.
Um die Daten auszurichten, kann es notwendig sein, einige bedeutungslose Bytes zwischen dem Ende der letzten Datenstruktur und dem Beginn der nächsten einzufügen, das heißt Auffüllen von Datenstrukturen.
gcc bietet Funktionen zum Deaktivieren der Strukturauffüllung. dh um diese bedeutungslosen Bytes in einigen Fällen zu vermeiden. Betrachten Sie die folgende Struktur:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
wird 12 statt 8 sein. Wegen der Strukturpolsterung. Standardmäßig werden in X86 Strukturen auf 4-Byte-Ausrichtung aufgefüllt:
typedef struct
{
char Data1;
//3-Bytes Added here.
int Data2;
unsigned short Data3;
char Data4;
//1-byte Added here.
}sSampleStruct;
Wir können benutzen __attribute__((packed, aligned(X)))
darauf zu bestehen, dass eine bestimmte (X) große Polsterung vorhanden ist. X sollte Zweierpotenzen sein. Siehe hier
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}__attribute__((packed, aligned(1))) sSampleStruct;
Das oben angegebene gcc-Attribut erlaubt also kein Auffüllen der Struktur. 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 verwenden #pragma
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)
packed
bedeutet, dass es den kleinstmöglichen Platz für verwenden wird struct Ball
– dh es werden Felder ohne Polsterung zusammengepfercht
aligned
bedeutet jeder struct Ball
beginnt an einer 4-Byte-Grenze – dh für alle struct Ball
seine Adresse kann durch 4 geteilt werden
Dies sind GCC-Erweiterungen, die nicht Teil eines C-Standards sind.
Das Attribut packed
bedeutet, dass der Compiler keine Auffüllung zwischen den Feldern von hinzufügt struct
. Padding wird normalerweise verwendet, um Felder auf ihre natürliche Größe auszurichten, da einige Architekturen Strafen für nicht ausgerichteten Zugriff auferlegen oder dies überhaupt nicht zulassen.
aligned(4)
bedeutet, dass die Struktur auf eine durch 4 teilbare Adresse ausgerichtet werden sollte.
Es ist ein “Typattribut” .. (Ich habe das mit “C-Attribut gepackt” in Google gefunden. Sicher können andere mindestens so gut!)
– Benutzer166390
2. August 2012 um 3:01 Uhr
Siehe diese Frage – allerdings mit
aligned(4)
da brauchst du dir wahrscheinlich keine Sorgen zu machen.– Keith Thompson
2. August 2012 um 4:07 Uhr