scope de variables

¿Por qué las variables locales usan Stack en C / C ++?

Técnicamente, C no usa una stack. Si observa el estándar C99 , no encontrará ninguna referencia a la stack. Probablemente sea el mismo para el estándar C ++, aunque no lo he comprobado.

Las stacks son solo detalles de implementación utilizados por la mayoría de los comstackdores para implementar la semántica de almacenamiento automático en C.

La pregunta que realmente hace es: “¿por qué los comstackdores C y C ++ usan la stack de hardware para almacenar variables con extensión automática?”

Como han mencionado otros, ni las definiciones de lenguaje C ni C ++ dicen explícitamente que las variables deben almacenarse en una stack. Simplemente definen el comportamiento de las variables con diferentes duraciones de almacenamiento:

6.2.4 Duraciones de almacenamiento de objetos.

1 Un objeto tiene una duración de almacenamiento que determina su duración. Hay tres duraciones de almacenamiento: estática, automática y asignada. El almacenamiento asignado se describe en 7.20.3.

2 La vida útil de un objeto es la parte de la ejecución del progtwig durante la cual se garantiza que el almacenamiento se reserva para él. Un objeto existe, tiene una dirección constante , 25) y conserva su último valor almacenado durante su vida útil. 26) Si se hace referencia a un objeto fuera de su vida útil, el comportamiento no está definido. El valor de un puntero se vuelve indeterminado cuando el objeto al que apunta llega al final de su vida útil.

3 Un objeto cuyo identificador se declara con enlace externo o interno, o con el static especificador de la clase de almacenamiento tiene una duración de almacenamiento estático . Su vida útil es la ejecución completa del progtwig y su valor almacenado se inicializa solo una vez, antes del inicio del progtwig.

4 Un objeto cuyo identificador se declara sin vinculación y sin el static especificador de la clase de almacenamiento tiene una duración de almacenamiento automática .

5 Para un objeto de este tipo que no tiene un tipo de matriz de longitud variable, su tiempo de vida se extiende desde la entrada al bloque con el que está asociado hasta que la ejecución de ese bloque finaliza de alguna manera. (Entrar en un bloque cerrado o llamar a una función suspende, pero no finaliza, la ejecución del bloque actual). Si el bloque se ingresa recursivamente, se crea una nueva instancia del objeto cada vez. El valor inicial del objeto es indeterminado. Si se especifica una inicialización para el objeto, se realiza cada vez que se alcanza la statement en la ejecución del bloque; de lo contrario, el valor se vuelve indeterminado cada vez que se alcanza la statement.

Norma en lenguaje C, proyecto n1256 .

No hay duda de que el párrafo 5 fue escrito teniendo en cuenta las stacks de hardware, pero existen architectures extrañas que no usan una stack de hardware, al menos no de la misma manera que algo como x86. La stack de hardware simplemente hace que el comportamiento especificado en el párrafo 5 sea fácil de implementar.

Almacenamiento de datos locales: una subrutina con frecuencia necesita espacio de memoria para almacenar los valores de las variables locales, las variables que se conocen solo dentro de la subrutina activa y no retienen los valores una vez que regresan. A menudo es conveniente asignar espacio para este uso simplemente moviendo la parte superior de la stack lo suficiente para proporcionar el espacio. Esto es muy rápido en comparación con la asignación de montón. Tenga en cuenta que cada activación separada de una subrutina obtiene su propio espacio separado en la stack para los locales.

La asignación de stack es mucho más rápida, ya que todo lo que realmente hace es mover el astackdor. Al usar grupos de memoria, puede obtener un rendimiento comparable de la asignación de almacenamiento dynamic, pero eso viene con una ligera complejidad adicional y sus propios dolores de cabeza.

En Heaps hay otra capa de direccionamiento indirecto ya que tendrá que pasar de stack -> heap antes de obtener el objeto correcto. Además, la stack es local para cada subproceso y es inherentemente segura para subprocesos, mientras que el montón es libre para todos.

Depende de la implementación donde se almacenen las variables. Algunas computadoras pueden ni siquiera tener una “stack”: D

Aparte de eso, es habitual hacer algún tipo de mantenimiento de la casa al llamar a funciones para realizar un seguimiento de la dirección de retorno y tal vez algunas otras cosas. En lugar de crear otro método de mantenimiento de casa para variables locales, muchas implementaciones de comstackdores eligen utilizar el método ya existente, que implementa la stack, con solo cambios mínimos.

Las variables locales son locales a los marcos en la stack de llamadas.

Usar una stack permite la recursión.

Porque la stack es parte de la memoria que se descargará automáticamente cuando finalice el scope. Esta es la razón para llamar a veces variables locales como “automáticas”. Las variables locales en una llamada están “aisladas” de las llamadas recursivas o multiproceso a la misma función.

Las variables locales están limitadas al scope en el que se puede acceder. El uso de una stack permite el salto de control de un scope a otro y al regresar, para continuar con las variables locales presentes inicialmente.

Cuando hay salto, las variables locales se empujan y el salto se ejecuta. Al volver al ámbito, las variables locales se despliegan.