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