Justering 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
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.
Tack för dina kommentarer!
Fråga AI
Fråga AI
Fråga vad du vill eller prova någon av de föreslagna frågorna för att starta vårt samtal
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?
Fantastiskt!
Completion betyg förbättrat till 4.35
Justering 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
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.
Tack för dina kommentarer!