Understanding Memory Layout of Structs
Stryg for at vise menuen
Hukommelsesstrukturer i programmeringssproget C spiller en central rolle i forståelsen af, hvordan data lagres og tilgås i hukommelsen. Når en struktur defineres i C, bestemmer compileren, hvordan dens medlemmer placeres i hukommelsen baseret på justering og udfyldning regler.
Her er et overblik over, hvordan grundlæggende hukommelsestildeling for strukturer fungerer i C:
main.c
123456789101112131415#include <stdio.h> // simple struct struct Test { char x; // 1 byte int y; // 4 bytes }; int main() { struct Test example; printf("Size of struct Test: %zu\n", sizeof(example)); printf("Address of example.x (char): %p\n", &example.x); printf("Address of example.y (int): %p\n", &example.y); return 0; }
Som forventet burde en sådan struktur optage 5 bytes: 1 byte til char x, 4 bytes til int y, men dette vil være 8 bytes.
Hvorfor er størrelsen på strukturen meget større end forventet?
Dette sker, fordi compileren kan indsætte udfyldning (padding) mellem medlemmerne for at sikre, at hvert medlem starter på en adresse, der er et multiplum af dets størrelse.
På billedet kan du se, at den første del af hukommelsen (den lyse sektion) tilhører variablen char x, som kun optager én byte. Herefter er der tre tomme bytes — dette er udfyldning (padding), automatisk tilføjet af compileren for at sikre, at det næste element starter på den korrekte adresse. Efter udfyldningen gemmes variablen int y, som optager fire bytes.
Som resultat optager strukturen i alt otte bytes: én til char, tre til justering og fire til int.
Denne opbygning findes for at hjælpe processoren med at få mere effektiv adgang til data. Uden justering ville adgang til strukturens medlemmer tage længere tid, og programmet ville køre langsommere.
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