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?

Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top