Hvordan finner jeg på størrelse med en struct?

stemmer
26
struct a
{
    char *c;
    char b;
};

Hva er sizeof (a)?

Publisert på 27/09/2008 klokken 04:58
kilden bruker
På andre språk...                            


8 svar

stemmer
33
#include <stdio.h>

typedef struct { char* c; char b; } a;

int main()
{
    printf("sizeof(a) == %d", sizeof(a));
}

Jeg får "sizeof (a) == 8", på en 32-bits maskin. Den totale størrelsen på strukturen vil avhenge av pakking: I mitt tilfelle, er standard pakke 4, så 'c' tar 4 bytes, 'b' tar en byte, forlater 3 padding bytes å bringe den til neste multiplum av 4 : 8. Hvis du ønsker å endre denne pakking, de fleste kompilatorer har en måte å endre det, for eksempel på MSVC:

#pragma pack(1)
typedef struct { char* c; char b; } a;

gir sizeof (a) == 5. Hvis du gjør dette, må du være forsiktig med å nullstille pakking før noen bibliotek overskrifter!

Svarte 27/09/2008 kl. 05:13
kilden bruker

stemmer
9

I motsetning til hva noen av de andre svar har sagt, på de fleste systemer, i fravær av en pragma eller kompilator alternativ, størrelsen av strukturen vil være minst 6 bytes og, på de fleste 32-bits systemer, 8 bytes. For 64-bits systemer, kan størrelsen lett bli 16 byte. Justering kommer inn i bildet; alltid. Sizeof en enkelt struct må være slik at en rekke av disse størrelser kan fordeles og de individuelle medlemmer av gruppen er tilstrekkelig innrettet for prosessoren i spørsmålet. Følgelig, hvis størrelsen på struct var 5 som andre har en hypotese, da en matrise av to slike strukturer ville være 10 bytes lang, og forkullingen peker i den andre gruppe medlem ville være innrettet på en odde byte, som ville (på mest prosessorer) føre til en større flaskehals i ytelse.

Svarte 27/09/2008 kl. 05:10
kilden bruker

stemmer
4

Hvis du ønsker å telle det manuelt, på størrelse med en struct er bare størrelsen på hver av sine data medlemmer etter regnskap for justering. Det finnes ingen magiske overhead byte for en struct.

Svarte 27/09/2008 kl. 05:21
kilden bruker

stemmer
2

Den nøyaktige verdi er sizeof (a) .
Du kan også ta en risiko og antar at det er i dette tilfellet ikke mindre enn to og ikke større enn 16.

Svarte 27/09/2008 kl. 05:09
kilden bruker

stemmer
1

Dette vil variere avhengig av arkitektur og hvordan den behandler grunnleggende datatyper. Det vil også avhenge av om systemet krever naturlig justering.

Svarte 27/09/2008 kl. 05:04
kilden bruker

stemmer
0

Sizeof strukturen skal være 8 byte på en 32 bit system, slik at størrelsen av strukturen blir multiplum av 2. Dette gjør at individuelle strukturene som er tilgjengelig på de riktige byte grenser når en rekke strukturer er deklarert. Dette oppnås ved utfylling struktur med 3 bit-grupper ved slutten.

Hvis konstruksjonen hadde pekeren erklært etter trekullet, ville det fremdeles være 8 byte i størrelse, men 3-byte polstringen ville ha blitt tilsatt for å holde viseren (som er et 4 byte element) som er innrettet på en 4 byte adresse grense.

Tommelfingerregelen er at elementene skal være på en forskyvning som er multiplum av deres byte størrelse, og selve strukturen bør være av en størrelse som er et multiplum av to.

Svarte 27/09/2008 kl. 05:17
kilden bruker

stemmer
0

Jeg mistenker at du mener 'struct', ikke 'streng', og 'char' i stedet for 'Char'.

Størrelsen vil være gjennomføring avhengig. På de fleste 32-bits systemer, vil det trolig være 5 - 4 byte for pekeren, en for røye. Jeg tror ikke justeringen kommer inn i bildet her. Hvis du byttet 'c' og 'b', derimot, kan størrelsen vokse til 8 byte.

Ok, jeg prøvde det ut (g ++ 4.2.3, med -g) og jeg får 8.

Svarte 27/09/2008 kl. 05:02
kilden bruker

stemmer
0

Jeg antar at du mener struct og ikke streng, men på en 32-bit system vil det være enten 5 eller 8 byte, avhengig av om kompilatoren er utfylling struct.

Svarte 27/09/2008 kl. 05:00
kilden bruker

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more