Gå til innhold

g++ bruker dobbel strukturstørrelse


Anbefalte innlegg

Skrevet

I dette programmet reserverer g++ 24 byte på stakken ved start av funksjonen Grox():

struct SPerson {
   int age;
   int height;
   int width;
};

void Grox() {
   SPerson mrbean;
}

int main() {
   return 0;
}

 

I dette programmet reserverer g++ 0 byte ved start av Grox():

struct SPerson {
   int age;
   int height;
   int width;
};

void Grox() {

}

int main(int argc) {
   return 0;
}

 

Hvorfor i granskauen skjer dette? SPerson er jo bare 12 byte så det er jo høl i hue å reservere 24!

Videoannonse
Annonse
Skrevet

Jeg tipper det er fordi dataene blir alignet siden moderne prosessorer kan aksessere minnet raskere hvis minneaddressen er en multippel av 2 og størrelsen dens. Søk litt på "c struct alignment" eller noe, kan stille inn noen pragmaer eller attributter for å packe og aligne annerledes.

Skrevet (endret)

sizeof(SPerson) gir 12, så det har ikke noe med det og gjøre.

 

Edit:

 

void Grox() {
   SPerson mrbean, mrladen;
}

 

Tror du dette gir 24+24 = 48 eller 24+12 = 46? Nei da, g++ reserverer 40 byte!

Endret av tsg1zzn
Skrevet

Vel, jeg er rimelig sikker på at det er pga alignment, kan ikke se hvorfor den skulle gjøre det ellers. Som sagt, søk litt og se hvordan gcc aligner, så gir det nok mening.

Skrevet (endret)

Men på moderne prosessorer er den vel mest interresert i tall som kan deles med 4, og ikke 2?

 

edit: du kan jo disasemble programmet, og se hva som foregår.

Endret av GeirGrusom

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...