2010-03-30 7 views
0
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 4 octets, ou 32 bits. Donc, notre tampon de 5 octets est va vraiment prendre 8 octets (2 mots) de mémoire, et notre tampon de 10 octets est va prendre 12 octets (3 mots) de mémoire. Voilà pourquoi SP est soustrait par 20.affectation de la mémoire des variables locales

Pourquoi est Ceil pas ((5 + 10)/4) * 4 = 16?

Répondre

5

Parce que les variables individuelles doivent être alignées. Avec la formule que vous avez proposée, vous alignez uniquement la première variable de la pile, en laissant les variables suivantes non alignées, ce qui est mauvais pour les performances.

Ceci est aussi appelé "packing" et peut être fait en C/C++ avec des pragmas, mais n'est utile que dans des cas très spécifiques et peut être dangereux à la fois pour les performances et les pièges. Certains processeurs génèreront des erreurs sur les accès non-alignés lors de l'exécution, ce qui provoquera le crash de votre programme.

1

Les variables de votre architecture sont alignées individuellement. buffer1 est arrondi à 8 et buffer2 à 12 de sorte que les deux adresses de départ soient alignées sur 4 octets. Donc 8 + 12 = 20.

Questions connexes