Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lære Justering og Utfylling i Strukturer | Forståelse av Structs og Minne
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Mestre C-strukturer

bookJustering 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

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

question mark

Hvorfor overstiger størrelsen på en struct ofte summen av størrelsene til de individuelle feltene?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2

Spør AI

expand

Spør AI

ChatGPT

Spør om hva du vil, eller prøv ett av de foreslåtte spørsmålene for å starte chatten vår

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

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

question mark

Hvorfor overstiger størrelsen på en struct ofte summen av størrelsene til de individuelle feltene?

Select the correct answer

Alt var klart?

Hvordan kan vi forbedre det?

Takk for tilbakemeldingene dine!

Seksjon 3. Kapittel 2
some-alt