Domanda

void function(int a, int b, int c) {
   char buffer1[5];
   char buffer2[10];
}
  

Bisogna ricordare che la memoria può solo   essere affrontata in multipli di parola   taglia. Una parola nel nostro caso è di 4 byte,   o 32 bit. Così il nostro buffer di 5 byte è   davvero intenzione di prendere 8 byte (2 parole)   di memoria, e la nostra tampone 10 byte è   andare a prendere 12 byte (3 parole) di   memoria. Questo è il motivo SP è essere   sottratto da 20.

Perché non è Ceil ((5 + 10) / 4) * 4 = 16?

È stato utile?

Soluzione

A causa delle variabili individuali devono essere allineati. Con la vostra formula proposta, devi allineare solo la prima variabile sullo stack, lasciando le variabili seguenti unaligned, che è male per le prestazioni.

Questo è anche conosciuto come "packing" e può essere fatto in C / C ++ tramite pragma, ma è utile solo in casi specifici e può essere pericoloso sia per le prestazioni e come causa di potenziali trappole runtime. Alcuni processori genereranno guasti su accessi non allineati in fase di runtime, che in crash il programma.

Altri suggerimenti

Le variabili sul architettura sono allineati individualmente. buffer1 viene arrotondato a 8 e buffer2 a 12 in modo che entrambi i loro indirizzi di inizio sono 4 byte allineati. Quindi 8 + 12 = 20.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top