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
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 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!