Justering og Udfyldning i Structs
Justering
Hvert strukturfelt justeres til en grænse, der er et multiplum af størrelsen på strukturens største element.
For eksempel, hvis det største element er 4 bytes, vil hvert element blive justeret til en 4-byte grænse.
Dette gøres for at øge hastigheden på hukommelsesadgang og undgå hardwarejusteringsproblemer.
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; }
Du undrer dig måske over, hvorfor størrelsen på struct Example er 16 bytes, selvom hvert felt er justeret til grænsen for den største type, som er 8 bytes. Ved første øjekast kunne det tyde på, at alle tre felter justeret til 8 bytes ville give en samlet størrelse på 24 bytes. I virkeligheden fungerer det lidt anderledes.
Det første felt a er en char og optager 1 byte. For at sikre, at det næste felt b af typen int starter ved en 4-byte grænse, indsætter compileren 3 bytes udfyldning efter a. Feltet b optager selv 4 bytes og er nu korrekt justeret.
Det næste felt c er en double og skal starte ved en 8-byte grænse. Compileren tilføjer udfyldning efter b for at placere c på den korrekte adresse. Feltet c optager 8 bytes.
I alt: 1 byte til a + 3 bytes udfyldning + 4 bytes til b + 8 bytes til c = 16 bytes. Justeringsreglerne følges, og hukommelsen udnyttes effektivt.
Tak for dine kommentarer!
Spørg AI
Spørg AI
Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat
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?
Fantastisk!
Completion rate forbedret til 4.35
Justering og Udfyldning i Structs
Stryg for at vise menuen
Justering
Hvert strukturfelt justeres til en grænse, der er et multiplum af størrelsen på strukturens største element.
For eksempel, hvis det største element er 4 bytes, vil hvert element blive justeret til en 4-byte grænse.
Dette gøres for at øge hastigheden på hukommelsesadgang og undgå hardwarejusteringsproblemer.
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; }
Du undrer dig måske over, hvorfor størrelsen på struct Example er 16 bytes, selvom hvert felt er justeret til grænsen for den største type, som er 8 bytes. Ved første øjekast kunne det tyde på, at alle tre felter justeret til 8 bytes ville give en samlet størrelse på 24 bytes. I virkeligheden fungerer det lidt anderledes.
Det første felt a er en char og optager 1 byte. For at sikre, at det næste felt b af typen int starter ved en 4-byte grænse, indsætter compileren 3 bytes udfyldning efter a. Feltet b optager selv 4 bytes og er nu korrekt justeret.
Det næste felt c er en double og skal starte ved en 8-byte grænse. Compileren tilføjer udfyldning efter b for at placere c på den korrekte adresse. Feltet c optager 8 bytes.
I alt: 1 byte til a + 3 bytes udfyldning + 4 bytes til b + 8 bytes til c = 16 bytes. Justeringsreglerne følges, og hukommelsen udnyttes effektivt.
Tak for dine kommentarer!