62 votes

Pourquoi est-ce ainsi beaucoup d'espace alloué sur la pile?

Cette question vient de répondre à un Débordement de Pile question Pourquoi les livres le disent, "le compilateur alloue de l'espace pour les variables dans la mémoire"?, où j'ai essayé de démontrer à l'OP de ce qui se passe quand vous allouer une variable sur la pile et de la manière dont le compilateur génère du code qui connaît la taille de la mémoire à allouer. Apparemment, le compilateur alloue beaucoup plus d'espace que ce qui est nécessaire.

Cependant, lors de la compilation suivantes

#include <iostream>
using namespace std;

int main()
{
    int foo;
    return 0;
}

Vous obtenez le résultat suivant assembleur de sortie avec Visual C++ 2012 compilé en mode debug avec aucun des optimisations sur:

int main()
{
00A31CC0  push        ebp
00A31CC1  mov         ebp,esp
00A31CC3  sub         esp,0CCh  // Allocates 204 bytes here.
00A31CC9  push        ebx
00A31CCA  push        esi
00A31CCB  push        edi
00A31CCC  lea         edi,[ebp-0CCh]
00A31CD2  mov         ecx,33h
00A31CD7  mov         eax,0CCCCCCCCh
00A31CDC  rep stos    dword ptr es:[edi]
   int foo;
   return 0;
00A31CDE  xor         eax,eax
}

L'ajout d'un int de mon programme rend la ligne commentée ci-dessus pour les éléments suivants:

00B81CC3  sub         esp,0D8h // Allocate 216 bytes

La question posée par @JamesKanze dans ma réponse liée au sommet, c'est pourquoi le compilateur, et apparemment ce n'est pas seulement de Visual C++ (je n'ai pas fait l'expérience avec un autre compilateur), réparti de la 204 et 216 octets, respectivement, où dans le premier cas, il n'a besoin que de quatre et dans le second, elle a besoin de seulement huit?

Ce programme crée un fichier exécutable 32 bits.

À partir d'un point de vue technique, pourquoi peut-il nécessaire d'allouer de 204 octets au lieu de 4?

EDIT:

Appelant les deux fonctions et la création d'un double et deux int en main, vous obtenez

 01374493  sub         esp,0E8h  // 232 bytes

Pour le même programme que l'édition ci-dessus, il le fait en mode release (pas d'optimisations):

 sub    esp, 8                // Two ints
 movsd  QWORD PTR [esp], xmm0 // I suspect this is where my `double` goes

102voto

Hans Passant Points 475940

Cet espace supplémentaire est généré par le /Zi option de compilation. Qui permet de Modifier + Continuer. L'espace supplémentaire est disponible pour les variables locales de ce que vous pourriez ajouter lorsque vous modifiez du code pendant le débogage.

Vous êtes aussi de voir l'effet de l' /CCF, il initialise toutes les variables locales à 0xcccccccc de sorte qu'il est plus facile de diagnostiquer les problèmes dus à l'oubli pour initialiser des variables. Bien sûr, rien de ce code est généré dans la Version par défaut des paramètres de configuration.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X