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:
typedef struct
{
char Data1;
int Data2;
unsigned short Data3;
char Data4;
}sSampleStruct;
sizeof(sSampleStruct)
wird 12 statt 8 sein. Wegen der Strukturauffüllung. In X86 werden Strukturen standardmäßig 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 verwenden __attribute__((packed, aligned(X)))
, um auf einer bestimmten (X) Größe Polsterung zu bestehen. 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 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
#pragma pack(push, 1)
//Structure 1
......
//Structure 2
......
#pragma pack(pop)