Assegnazione della memoria delle variabili locali
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?
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.