Hoe de waarde van sizeof (struct) in C te berekenen


Beste antwoord

De exacte volgorde sizeof(struct) is een compileerfout in C. Ik neem aan dat u vraagt ​​hoe u de grootte van een specifiek struct bepaalt.

Dat antwoord is niet rechtstreeks geleverd door de C-taaldefinitie. Het is eerder een functie van de ABI voor uw specifieke doelarchitectuur. (ABI staat voor Application Binary Interface.)

De C-taalstandaard legt een aantal algemene regels vast. Als u bijvoorbeeld een struct met meerdere leden heeft, deelt het eerste lid een adres met de struct zelf, en volgende leden zullen op hogere adressen zijn.

Bitvelden hebben hun eigen set regels. Ik zal ze hier niet samenvatten.

Voor een eerste bestelling is de grootte van een struct minstens zo groot als de som van de grootte van de leden (waarbij bitvelden voorlopig buiten beschouwing worden gelaten). Leden kunnen uitlijningsbeperkingen hebben, en als ze dat doen, kan de omgeving opvulling tussen leden en opvulling aan het einde van de struct introduceren.

Beschouw het volgende struct op een architectuur die 8-byte uitlijning vereist voor double waarden:

struct fun {

char a;

double b;

char c;

};

Volgens de regels van de C-taal, b moet op een hoger adres staan ​​dan a in elk exemplaar van struct fun. Evenzo moet c op een hoger adres staan ​​dan b.

Als gevolg hiervan bezet deze specifieke structuur waarschijnlijk 24 bytes, vanwege de uitlijningsbeperkingen op b op die architectuur. Dezelfde structuur vereist misschien maar 16 bytes op een architectuur die slechts 4 byte uitlijning vereist voor double.

Geloof me niet?

Overtuig uzelf:

Uiteindelijk moet u de ABI van uw doelplatform raadplegen om te begrijpen hoe een struct wordt samengepakt voor dat doelwit.

Of gebruik gewoon sizeof als het u persoonlijk niet kan schelen, maar uw code het wel nodig heeft.

Antwoord

Hoe bereken ik de waarde van sizeof (struct) in C?

U niet. De compiler doet dat.

Ten eerste is sizeof(struct) een syntaxisfout. U vraagt ​​waarschijnlijk hoe u de grootte van een constructietype of van een object van een dergelijk type kunt bepalen. Het is belangrijk om precies te zijn. (Ik begrijp dat het verwijderen van de vraagdetails door Quora dat moeilijk maakt.)

Stel dat je een structuurtype hebt met de naam struct foo en / of een object van dat type met de naam obj. De grootte van het type is sizeof (struct foo), en de grootte van het object (dat gelijk is aan de grootte van het type) is sizeof foo . (De haakjes zijn vereist in het eerste hoofdlettergebruik en niet in de tweede. Er zijn eigenlijk twee verschillende vormen van de sizeof -operator. De ene wordt toegepast op een typenaam tussen haakjes, de andere op een expressie, wat vaak maar niet altijd een objectnaam is.)

Je denkt misschien dat je de grootte van een structuur kunt berekenen door de grootte van zijn leden bij elkaar op te tellen. U kunt het niet. Samenstellers kunnen opvulling tussen leden invoegen, en mogelijk na het laatste lid, om te voldoen aan uitlijnvereisten. De grootte van een structuur is ten minste de som van de afmetingen van de leden, maar als je de grootte van de hele structuur nodig hebt, gebruik dan sizeof. Daar is het voor.

Geef een reactie

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *