Hvordan beregne verdien av størrelsen på (struct) i C


Beste svaret

Den nøyaktige sekvensen sizeof(struct) er en kompileringsfeil i C. Jeg antar at du spør hvordan du bestemmer størrelsen på en bestemt struct.

Dette svaret er ikke gitt av C-språkdefinisjonen direkte. Snarere er det en funksjon av ABI for din spesielle målarkitektur. (ABI står for Application Binary Interface.)

C-språkstandarden inneholder noen brede regler. Hvis du for eksempel har en struct med flere medlemmer, vil det første medlemmet dele en adresse med struct, og påfølgende medlemmer vil være på høyere adresser.

Bitfields har sitt eget regelsett. Jeg vil ikke gjenskape dem her.

For første ordre vil størrelsen på struct være minst like stor som summen av størrelsen på medlemmene (ignorerer bitfelt for øyeblikket). Medlemmene kan ha justeringsbegrensninger, og hvis de gjør det, kan miljøet introdusere polstring mellom medlemmene og polstring på slutten av struct.

Vurder følgende struct på en arkitektur som krever 8-byte justering for double verdier:

struct fun {

char a;

double b;

char c;

};

Etter reglene i C-språket, b må være på en høyere adresse enn a i alle tilfeller av struct fun. På samme måte må c ha en høyere adresse enn b.

Som et resultat opptar denne strukturen sannsynligvis 24 byte, på grunn av justeringsbegrensningene for b for den arkitekturen. Den samme strukturen krever kanskje bare 16 byte i en arkitektur som bare krever 4 bytejustering for double.

Tro meg ikke?

Se selv:

Til slutt må du konsultere målplattformens ABI for å forstå hvordan en struct blir pakket sammen for det målet.

Eller bare bruk sizeof hvis du personlig ikke bryr deg, men koden din trenger å bry seg.

Svar

Hvordan beregner jeg verdien av sizeof (struct) i C?

Gjør du ikke det. Kompilatoren gjør det.

For det første er sizeof(struct) en syntaksfeil. Du spør sannsynligvis hvordan du skal bestemme størrelsen på en strukturtype eller et objekt av en slik type. Det er viktig å være presis. (Jeg forstår at Quoras fjerning av spørsmålsdetaljer gjør det vanskelig.)

La oss si at du har en strukturtype kalt struct foo og / eller et objekt av den typen som heter obj. Størrelsen på typen er sizeof (struct foo), og størrelsen på objektet (som er det samme som størrelsen på typen) er sizeof foo . (Parentesene er påkrevd i det første tilfellet og ikke i det andre. Det er faktisk to forskjellige former for operatøren sizeof. Den ene brukes på et parentesetypenavn, den andre på en uttrykk, som ofte er, men ikke alltid, et objektnavn.)

Du tenker kanskje på at du kan beregne størrelsen på en struktur ved å legge sammen størrelsen på medlemmene. Du kan ikke. Kompilatorer kan og setter inn polstring mellom medlemmene, og muligens etter det siste medlemmet, for å tilfredsstille justeringskravene. Størrelsen på en struktur er minst summen av størrelsen på medlemmene, men hvis du trenger størrelsen på hele strukturen, er det bare å bruke sizeof. Det er det det er for.

Legg igjen en kommentar

Din e-postadresse vil ikke bli publisert. Obligatoriske felt er merket med *