grootte van struct in C

Mogelijk duplicaat:
Waarom is ‘t sizeof voor een struct gelijk aan de som van sizeof van elk lid?

Beschouw de volgende C-code:

#include <stdio.h>    
struct employee
{
  int id;
  char name[30];  
};
int main()
{
  struct employee e1;      
  printf("%d %d %d", sizeof(e1.id), sizeof(e1.name), sizeof(e1));
  return(0);
}

De uitvoer is:

4 30 36

Waarom is de grootte van de structuur niet gelijk aan de som van de groottes van de individuele componentvariabelen?


Antwoord 1, autoriteit 100%

De compiler kan opvulling toevoegen voor uitlijningsvereisten. Merk op dat dit niet alleen van toepassing is op opvulling tussen de velden van een struct, maar ook van toepassing kan zijn op het einde van de struct (zodat in arrays van het structuurtype elk element correct is uitgelijnd).

Bijvoorbeeld:

struct foo_t {
    int x;
    char c;
};

Hoewel het veld cgeen opvulling nodig heeft, heeft de struct over het algemeen een sizeof(struct foo_t) == 8(op een 32-bits systeem – eerder een systeem met een 32-bits int-type) omdat er 3 bytes opvulling nodig is na het veld c.

Houd er rekening mee dat de opvulling mogelijk niet vereist is door het systeem (zoals x86 of Cortex M3), maar compilers kunnen het om prestatieredenen toch toevoegen.


Antwoord 2, autoriteit 4%

Zoals vermeld, zal de C-compiler opvulling toevoegen voor uitlijningsvereisten. Deze vereisten hebben vaak te maken met het geheugensubsysteem. Sommige typen computers hebben alleen toegang tot geheugen met een ‘leuke’ waarde, zoals 4 bytes. Dit is vaak hetzelfde als de woordlengte. De C-compiler kan dus velden in uw structuur uitlijnen met deze waarde om ze gemakkelijker toegankelijk te maken (bijv. 4 byte-waarden moeten 4 byte worden uitgelijnd) Verder kan het de onderkant van de structuur opvullen om gegevens uit te lijnen die de structuur volgen . Ik geloof dat er ook andere redenen zijn. Meer informatie is te vinden op dezewikipedia-pagina.


Antwoord 3, autoriteit 4%

Uw standaarduitlijning is waarschijnlijk 4 bytes. Ofwel het element van 30 bytes kreeg 32, of de structuur als geheel werd afgerond naar het volgende interval van 4 bytes.


Antwoord 4, autoriteit 3%

Uitlijnen op 6 bytes is niet raar, omdat het uitlijnt op adressen die meerdere tot 4 zijn.

Dus in principe heb je 34 bytes in je structuur en de volgende structuur moet op het adres worden geplaatst, dat is een veelvoud van 4. De dichtstbijzijnde waarde na 34 is 36. En dit opvulgebied telt mee in de grootte van de structuur.

Other episodes