Justering og Utfylling i Strukturer
Justering
Hvert felt i en struktur justeres til en grense som er et multiplum av størrelsen til strukturens største element.
For eksempel, hvis det største elementet er 4 byte stort, vil hvert element bli justert på en 4-byte grense.
Dette gjøres for å øke hastigheten på minnetilgang og unngå maskinvareproblemer med justering.
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 lurer kanskje på hvorfor størrelsen på struct Example er 16 byte, selv om hvert felt er justert til grensen for den største typen, som er 8 byte. Ved første øyekast kan det å justere alle tre feltene til 8 byte tilsi en total størrelse på 24 byte. I virkeligheten fungerer det litt annerledes.
Det første feltet a er en char og opptar 1 byte. For å sikre at neste felt b av typen int starter på en 4-bytes grense, legger kompilatoren til 3 bytes med utfylling etter a. Feltet b i seg selv opptar 4 bytes og er nå korrekt justert.
Neste felt c er en double og må starte på en 8-bytes grense. Kompilatoren legger til utfylling etter b for å plassere c på riktig adresse. Feltet c opptar 8 bytes.
Totalt: 1 byte for a + 3 bytes utfylling + 4 bytes for b + 8 bytes for c = 16 bytes. Justeringsreglene følges, og minnet brukes effektivt.
Takk for tilbakemeldingene dine!
Spør AI
Spør AI
Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår
Fantastisk!
Completion rate forbedret til 4.35
Justering og Utfylling i Strukturer
Sveip for å vise menyen
Justering
Hvert felt i en struktur justeres til en grense som er et multiplum av størrelsen til strukturens største element.
For eksempel, hvis det største elementet er 4 byte stort, vil hvert element bli justert på en 4-byte grense.
Dette gjøres for å øke hastigheten på minnetilgang og unngå maskinvareproblemer med justering.
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 lurer kanskje på hvorfor størrelsen på struct Example er 16 byte, selv om hvert felt er justert til grensen for den største typen, som er 8 byte. Ved første øyekast kan det å justere alle tre feltene til 8 byte tilsi en total størrelse på 24 byte. I virkeligheten fungerer det litt annerledes.
Det første feltet a er en char og opptar 1 byte. For å sikre at neste felt b av typen int starter på en 4-bytes grense, legger kompilatoren til 3 bytes med utfylling etter a. Feltet b i seg selv opptar 4 bytes og er nå korrekt justert.
Neste felt c er en double og må starte på en 8-bytes grense. Kompilatoren legger til utfylling etter b for å plassere c på riktig adresse. Feltet c opptar 8 bytes.
Totalt: 1 byte for a + 3 bytes utfylling + 4 bytes for b + 8 bytes for c = 16 bytes. Justeringsreglene følges, og minnet brukes effektivt.
Takk for tilbakemeldingene dine!