2009-11-06 17 views
10

Tengo una pregunta sobre el siguiente código C:¿Cuándo se asigna espacio de pila para las variables locales?

void my_function() 
{ 
    int i1; 
    int j1; 

    // Do something... 

    if (check_something()) 
    { 
     int i2; 
     int j2; 

     // Do something else... 
    } 

    // Do some more stuff... 
} 

¿Hay garantías sobre cuándo espacio de pila se asigna/desasignado de i2 y J2, o depende del compilador? Esperaría que el puntero de la pila se ajuste cuando i2 y j2 entren en el alcance y se ajusten cuando se salgan del alcance, pero luego pensó que algunos compiladores podrían simplemente "optimizar" todo y tener en cuenta las variables en un ámbito anidado cuando la función se ingresa primero.

Sé que puedo ver el código de ensamblado generado por mi compilador, pero me preguntaba si la implementación puede dejarse al compilador.

Gracias!

+5

Considere también que las variables se pueden asignar a los registros ... – unwind

Respuesta

6

El compilador puede hacer lo que quiera, siempre que la semántica del idioma sea reservada. En otras palabras, i2 y j2 pueden vincularse a lugares de memoria antes de que la ejecución llegue al punto de entrada de su bloque, y pueden ser ilimitados siempre que eso no afecte a la semántica de su código.

8

No hay garantías.

Diferentes indicadores de optimización probablemente darán como resultado diferentes métodos para guardar variables.

El compilador puede incluso hacer que 1 o más variables no utilicen la pila en absoluto y mantenerlas en registros durante toda la ejecución de la función.

+0

+! sin garantías –

4

Como tengo entendido, incluso no puede recibir ninguna garantía de que estas variables estén asignadas en la pila, podrían almacenarse en registros.

Lo que realmente podría afectar aquí:

  • consejos compilador para colocar variables para registrar mediante el uso de registro palabra clave.

  • compilador de ayuda con la localización ámbito de las variables moviendo declaración a tan tardía lugar como puedas:

 
    int f(void) 
    { 
     /* var1 and var2 probably use the same place for storage. */ 
     { 
      int var1; 
      /* ... do something */ 
     } 

     { 
      int var2; 
      /* ... do something */ 
     } 
    } 


  • Incluso teniendo en cuenta la inicialización de retardo alcance definido:
 
{ 
    int i; /* Yes, you must declare it at the begin of block. 

    /* Do something... */ 

    i = START_VALUE; 
    /* But you need it only here and below... */ 
} 
0

si "check_something()" se evalúa fácilmente en 0, ese bloque completo se optimizará utilizando un nivel de optimización suficientemente alto. Sí, depende del compilador. En general, si está comprobando el valor de retorno de una llamada a función, no se optimizará. La mejor manera de abordar esto sería compilarlo y, en realidad, ver el desmontaje del archivo para verificar que lo que realmente está sucediendo está sucediendo.

3

Si las variables se van a poner en la pila, el espacio de pila se asigna al principio de la función antes de la primera instrucción en la función.El puntero de la pila se moverá hacia arriba (o hacia abajo) la cantidad total de bytes para almacenar todas las variables locales.

Cuestiones relacionadas