Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Justering og Udfyldning i Structs | Forståelse af Structs og Hukommelse
Beherskelse af C Structs

bookJustering 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

main.c

copy
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.

question mark

Hvorfor overstiger størrelsen af en struct ofte summen af størrelserne af dens individuelle felter?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 2

Spørg AI

expand

Spørg AI

ChatGPT

Spørg om hvad som helst eller prøv et af de foreslåede spørgsmål for at starte vores chat

Suggested prompts:

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?

bookJustering 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

main.c

copy
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.

question mark

Hvorfor overstiger størrelsen af en struct ofte summen af størrelserne af dens individuelle felter?

Select the correct answer

Var alt klart?

Hvordan kan vi forbedre det?

Tak for dine kommentarer!

Sektion 3. Kapitel 2
some-alt