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