Affectation de la mémoire des variables locales
Question
void function(int a, int b, int c) {
char buffer1[5];
char buffer2[10];
}
Il faut se rappeler que la mémoire ne peut être adressé en multiples du mot Taille. Un mot dans notre cas est de 4 octets, ou 32 bits. Donc, notre tampon de 5 octets est va vraiment prendre 8 octets (2 mots) de la mémoire, et notre tampon de 10 octets est va prendre 12 octets (3 mots) de Mémoire. C'est pourquoi SP est d'être soustrait de 20.
Pourquoi ce n'est pas Ceil ((5 + 10) / 4) * 4 = 16?
La solution
Les variables individuelles doivent être alignées. Avec votre formule proposée, vous souhaitez aligner uniquement la première variable sur la pile, laissant les variables suivantes unaligned, ce qui est mauvais pour la performance.
Ceci est également connu comme « emballage » et peut être fait en C / C ++ avec pragma, mais il est utile que dans des cas très spécifiques et peut être dangereux à la fois pour la performance et comme cause de pièges potentiels d'exécution. Certains processeurs généreront des défauts sur les accès non alignés lors de l'exécution, ce qui va planter votre programme.
Autres conseils
Les variables sur votre architecture sont alignées individuellement. buffer1 obtient arrondi à 8 et 12 à buffer2 de telle sorte que deux de leurs adresses de départ sont alignés sur 4 octets. Donc, 8 + 12 = 20.