Ausrichtung und Auffüllung in Structs
Ausrichtung
Jedes Strukturfeld wird an einer Grenze ausgerichtet, die ein Vielfaches der Größe des größten Elements der Struktur ist.
Beispielsweise wenn das größte Element 4 Byte groß ist, wird jedes Element an einer 4-Byte-Grenze ausgerichtet.
Dies dient dazu, den Speicherzugriff zu beschleunigen und Hardware-Ausrichtungsprobleme zu vermeiden.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Vielleicht fragen Sie sich, warum die Größe von struct Example 16 Byte beträgt, obwohl jedes Feld an der Grenze des größten Typs, nämlich 8 Byte, ausgerichtet ist. Auf den ersten Blick könnte man annehmen, dass die Ausrichtung aller drei Felder auf 8 Byte eine Gesamtgröße von 24 Byte ergibt. Tatsächlich funktioniert es jedoch etwas anders.
Das erste Feld a ist ein char und belegt 1 Byte. Damit das nächste Feld b vom Typ int an einer 4-Byte-Grenze beginnt, fügt der Compiler nach a 3 Bytes Auffüllung (Padding) hinzu. Das Feld b selbst belegt 4 Bytes und ist nun korrekt ausgerichtet.
Das nächste Feld c ist ein double und muss an einer 8-Byte-Grenze beginnen. Der Compiler fügt nach b weiteres Padding hinzu, um c an der richtigen Adresse zu platzieren. Das Feld c belegt 8 Bytes.
Insgesamt: 1 Byte für a + 3 Bytes Padding + 4 Bytes für b + 8 Bytes für c = 16 Bytes. Die Ausrichtungsregeln werden eingehalten und der Speicher wird effizient genutzt.
Danke für Ihr Feedback!
Fragen Sie AI
Fragen Sie AI
Fragen Sie alles oder probieren Sie eine der vorgeschlagenen Fragen, um unser Gespräch zu beginnen
Can you explain why the struct isn't 24 bytes if the largest element is 8 bytes?
How does padding work in structs with different data types?
Can you show an example of how the memory layout looks for this struct?
Großartig!
Completion Rate verbessert auf 4.35
Ausrichtung und Auffüllung in Structs
Swipe um das Menü anzuzeigen
Ausrichtung
Jedes Strukturfeld wird an einer Grenze ausgerichtet, die ein Vielfaches der Größe des größten Elements der Struktur ist.
Beispielsweise wenn das größte Element 4 Byte groß ist, wird jedes Element an einer 4-Byte-Grenze ausgerichtet.
Dies dient dazu, den Speicherzugriff zu beschleunigen und Hardware-Ausrichtungsprobleme zu vermeiden.
main.c
1234567891011121314151617181920#include <stdio.h> // simple struct struct Example { char a; int b; double c; }; int main() { struct Example test; printf("Size of struct Example: %zu\n", sizeof(test)); printf("Address of test.x (char): %p\n", &test.a); printf("Address of test.y (int): %p\n", &test.b); printf("Address of test.c (double): %p\n", &test.c); return 0; }
Vielleicht fragen Sie sich, warum die Größe von struct Example 16 Byte beträgt, obwohl jedes Feld an der Grenze des größten Typs, nämlich 8 Byte, ausgerichtet ist. Auf den ersten Blick könnte man annehmen, dass die Ausrichtung aller drei Felder auf 8 Byte eine Gesamtgröße von 24 Byte ergibt. Tatsächlich funktioniert es jedoch etwas anders.
Das erste Feld a ist ein char und belegt 1 Byte. Damit das nächste Feld b vom Typ int an einer 4-Byte-Grenze beginnt, fügt der Compiler nach a 3 Bytes Auffüllung (Padding) hinzu. Das Feld b selbst belegt 4 Bytes und ist nun korrekt ausgerichtet.
Das nächste Feld c ist ein double und muss an einer 8-Byte-Grenze beginnen. Der Compiler fügt nach b weiteres Padding hinzu, um c an der richtigen Adresse zu platzieren. Das Feld c belegt 8 Bytes.
Insgesamt: 1 Byte für a + 3 Bytes Padding + 4 Bytes für b + 8 Bytes für c = 16 Bytes. Die Ausrichtungsregeln werden eingehalten und der Speicher wird effizient genutzt.
Danke für Ihr Feedback!