Probé este código en Visual C++ 2008 y muestra que A y B no tienen la misma dirección.C++ stack y scope
int main()
{
{
int A;
printf("%p\n", &A);
}
int B;
printf("%p\n", &B);
}
Pero ya que A ya no existe cuando se define B, me parece que el mismo nivel de la pila podría ser reutilizado ...
No entiendo por qué el compilador no hace parece hacer lo que parece una optimización muy simple (que podría importar en el contexto de variables más grandes y funciones recursivas, por ejemplo). Y no parece que reutilizarlo sea más pesado en la CPU ni en la memoria. ¿Alguien tiene una explicación para esto?
Creo que la respuesta está en la línea de "porque es mucho más complejo de lo que parece", pero sinceramente no tengo ni idea.
edit: Algunas precisiones con respecto a las respuestas y los comentarios a continuación.
El problema con este código es que cada vez que se llama a esta función, la pila crece "un número entero demasiado". Por supuesto, esto no es problema en el ejemplo, pero considera grandes variables y llamadas recursivas y tienes un desbordamiento de pila que podría evitarse fácilmente.
Lo que sugiero es una optimización de la memoria, pero no veo cómo podría dañar el rendimiento.
Y por cierto, esto ocurre en las versiones , todas las optimizaciones estarán activadas.
¿Está compilando una versión de lanzamiento o una versión de depuración? – Michael
lo que está sugiriendo es una optimización de ** espacio **, pero no necesariamente una optimización de velocidad. –
Si todos los locales son demasiado grandes para caber en una línea de caché, esto se convierte en una optimización de velocidad ya que no tiene una falta de caché. – Michael