world tuto program first cpp c++ compiler-construction

c++ - tuto - ¿Por qué se asigna tanto espacio en la pila?



program c++ (1)

Este espacio adicional es generado por la opción de compilación / Zi. Que habilita Editar + Continuar. El espacio adicional está disponible para las variables locales que puede agregar al editar el código durante la depuración.

También está viendo el efecto de / RTC, inicializa todas las variables locales a 0xcccccccc para que sea más fácil diagnosticar problemas debido a que olvida inicializar variables. Por supuesto, nada de este código se genera en la configuración de configuración de Release predeterminada.

Esta pregunta proviene de responder a la pregunta sobre el desbordamiento de pila ¿ Por qué los libros dicen "el compilador asigna espacio para las variables en la memoria"? , donde intenté demostrar al OP qué sucede cuando asigna una variable en la pila y cómo el compilador genera código que conoce el tamaño de la memoria para asignar. Aparentemente el compilador asigna mucho más espacio de lo que se necesita.

Sin embargo, al compilar el siguiente

#include <iostream> using namespace std; int main() { int foo; return 0; }

Obtiene la siguiente salida de ensamblador con Visual C ++ 2012 compilado en modo de depuración sin optimizaciones en:

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 }

Al agregar una int más a mi programa, la línea comentada arriba es la siguiente:

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

La pregunta planteada por @JamesKanze en mi respuesta vinculada arriba, es por qué el compilador, y aparentemente no es solo Visual C ++ (no he hecho el experimento con otro compilador), asignó 204 y 216 bytes respectivamente, donde en el primer caso solo necesita cuatro y en el segundo solo necesita ocho?

Este programa crea un ejecutable de 32 bits.

Desde una perspectiva técnica, ¿por qué necesita asignar 204 bytes en lugar de solo 4?

EDITAR:

Llamando a dos funciones y creando un double y dos int en main, obtienes

01374493 sub esp,0E8h // 232 bytes

Para el mismo programa que la edición anterior, lo hace en modo de lanzamiento (sin optimizaciones):

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