Notice: This page requires JavaScript to function properly.
Please enable JavaScript in your browser settings or update your browser.
Lära Justering och Utfyllnad i Strukturer | Förståelse av Structs och Minne
Practice
Projects
Quizzes & Challenges
Quizzes
Challenges
/
Behärska C-Strukturer

bookJustering och Utfyllnad i Strukturer

Justering

Varje strukturfält justeras till en gräns som är en multipel av storleken på strukturens största element.

Till exempel, om det största elementet är 4 byte stort, kommer varje element att justeras på en 4-bytegräns.

Detta görs för att snabba upp minnesåtkomst och undvika problem med maskinvarujustering.

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 kanske undrar varför storleken på struct Example är 16 byte, även om varje fält justeras till gränsen för den största typen, som är 8 byte. Vid första anblicken kan det verka som att justering av alla tre fält till 8 byte skulle ge en total storlek på 24 byte. I verkligheten fungerar det lite annorlunda.

Det första fältet a är en char och upptar 1 byte. För att säkerställa att nästa fält b av typen int börjar vid en 4-bytegräns, lägger kompilatorn till 3 bytes utfyllnad efter a. Fältet b tar själv upp 4 bytes och är nu korrekt justerat.

Nästa fält c är en double och måste börja vid en 8-bytegräns. Kompilatorn lägger till utfyllnad efter b för att placera c på rätt adress. Fältet c upptar 8 bytes.

Totalt: 1 byte för a + 3 bytes utfyllnad + 4 bytes för b + 8 bytes för c = 16 bytes. Justeringsreglerna följs och minnet används effektivt.

question mark

Varför överstiger storleken på en struct ofta summan av storlekarna på dess individuella fält?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2

Fråga AI

expand

Fråga AI

ChatGPT

Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal

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 och Utfyllnad i Strukturer

Svep för att visa menyn

Justering

Varje strukturfält justeras till en gräns som är en multipel av storleken på strukturens största element.

Till exempel, om det största elementet är 4 byte stort, kommer varje element att justeras på en 4-bytegräns.

Detta görs för att snabba upp minnesåtkomst och undvika problem med maskinvarujustering.

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 kanske undrar varför storleken på struct Example är 16 byte, även om varje fält justeras till gränsen för den största typen, som är 8 byte. Vid första anblicken kan det verka som att justering av alla tre fält till 8 byte skulle ge en total storlek på 24 byte. I verkligheten fungerar det lite annorlunda.

Det första fältet a är en char och upptar 1 byte. För att säkerställa att nästa fält b av typen int börjar vid en 4-bytegräns, lägger kompilatorn till 3 bytes utfyllnad efter a. Fältet b tar själv upp 4 bytes och är nu korrekt justerat.

Nästa fält c är en double och måste börja vid en 8-bytegräns. Kompilatorn lägger till utfyllnad efter b för att placera c på rätt adress. Fältet c upptar 8 bytes.

Totalt: 1 byte för a + 3 bytes utfyllnad + 4 bytes för b + 8 bytes för c = 16 bytes. Justeringsreglerna följs och minnet används effektivt.

question mark

Varför överstiger storleken på en struct ofta summan av storlekarna på dess individuella fält?

Select the correct answer

Var allt tydligt?

Hur kan vi förbättra det?

Tack för dina kommentarer!

Avsnitt 3. Kapitel 2
some-alt