Supongamos esto:
void func()
{
...
if( blah )
{
int x;
}
...
}
¿Se x
reserva el espacio para la pila inmediatamente cuando func
se ingresa, o solo si el bloque se ejecuta realmente?
¿O es la elección del compilador?
¿C y C ++ se comportan igual sobre esto?
c++
c
stack
allocation
Petruza
fuente
fuente
Respuestas:
Quién dijo que el compilador reservará cualquier espacio (solo puede registrarse).
Esto es completamente indefinido.
Todo lo que puede decir es que
x
solo se puede acceder a él ( ) desde el interior del bloque interno.La forma en que el compilador asigna memoria (en una pila, si es que existe) depende completamente del compilador (ya que la región de memoria puede reutilizarse para múltiples objetos (si el compilador puede probar que sus vidas no se superponen)).
Indeterminado.
Indeterminado.
Pero si
x
se tratara de un objeto de clase, el constructor solo se ejecutará si se ingresa el bloque.Es posible que el compilador ni siquiera asigne memoria.
si
fuente
Bueno, es realmente la elección del compilador, pero lo que he observado es que cuando compilo sin optimizaciones , (que es lo que solemos hacer para poder depurar nuestro código), el compilador tiende a hacer las cosas de una manera bastante clara. corte, moda determinista y confiable:
El compilador no optimizar distancia cualquier variables locales. (Excepto, tal vez, variables definidas explícitamente como
register
, pero eso debe ser verificado).El espacio de pila para todas las variables locales, sin importar cómo estén anidadas, se reserva de inmediato cuando se ingresa la función.
El espacio de pila no se reutiliza en ámbitos anidados separados. Esto significa que
void f(){ { int x; } { int y; } }
asignará espacio para dosint
variables; el espacio asignado parax
lo que no puede volver a utilizar paray
.Por supuesto, si habilita las optimizaciones, todo lo que Loki Astari escribió en la respuesta aceptada es cierto.
fuente