Bedste svar
Den nøjagtige rækkefølge sizeof(struct)
er en kompileringsfejl i C. Jeg antager, at du spørger, hvordan du bestemmer størrelsen på en bestemt struct
.
Dette svar er ikke leveret af definitionen på C-sprog direkte. Det er snarere en funktion af ABI til din specifikke målarkitektur. (ABI står for Application Binary Interface.)
C-sprogstandarden indeholder nogle brede regler. Hvis du f.eks. Har en struct
med flere medlemmer, vil det første medlem dele en adresse med struct
, og efterfølgende medlemmer vil være på højere adresser.
Bitfelter har deres eget regelsæt. Jeg vil ikke sammenfatte dem her.
For en første ordre vil størrelsen af en struct
være mindst lige så stor som summen af størrelsen på dets medlemmer (ignorerer bitfelter for øjeblikket). Medlemmer kan have justeringsbegrænsninger, og hvis de gør det, kan miljøet introducere polstring mellem medlemmer og polstring i slutningen af struct
.
Overvej følgende struct
på en arkitektur, der kræver 8-byte-justering for double
-værdier:
struct fun {
char a;
double b;
char c;
};
Efter reglerne i C-sproget, b
skal være på en højere adresse end a
i ethvert tilfælde af struct fun
. Ligeledes skal c
have en højere adresse end b
.
Som et resultat optager denne særlige struktur sandsynligvis 24 byte på grund af justeringsbegrænsningerne for b
for denne arkitektur. Den samme struktur kræver muligvis kun 16 byte i en arkitektur, der kun kræver 4 byte-justering for double
.
Tro mig ikke?
Se selv:
I sidste ende skal du konsultere din målplatforms ABI for at forstå, hvordan en struct
bliver pakket sammen til det mål.
Eller brug bare sizeof
hvis du personligt ikke er ligeglad, men din kode skal være ligeglad.
Svar
Hvordan beregner jeg værdien af størrelsen af (struct) i C?
Det gør du ikke. Compileren gør det.
Først og fremmest er sizeof(struct)
en syntaksfejl. Du spørger sandsynligvis, hvordan du bestemmer størrelsen på en strukturtype eller et objekt af en sådan type. Det er vigtigt at være præcis. (Jeg forstår, at Quoras fjernelse af spørgsmålsdetaljer gør det vanskeligt.)
Lad os sige, at du har en strukturtype ved navn struct foo
og / eller et objekt af den type, der hedder obj
. Størrelsen på typen er sizeof (struct foo)
, og objektets størrelse (som er den samme som størrelsen på dens type) er sizeof foo
. (Parenteserne kræves i det første tilfælde og ikke i det andet. Der er faktisk to forskellige former for sizeof
operatøren. Den ene anvendes på et parentesetypenavn, den anden på en udtryk, som ofte men ikke altid er et objektnavn.)
Du tænker måske på, at du kan beregne størrelsen på en struktur ved at tilføje størrelsen på dens medlemmer. Det kan du ikke. Kompilatorer kan og indsætter polstring mellem medlemmer og muligvis efter det sidste medlem for at tilfredsstille tilpasningskrav. Størrelsen på en struktur er mindst summen af størrelsen på dens medlemmer, men hvis du har brug for størrelsen på hele strukturen, skal du bare bruge sizeof
. Det er det, det er til.