stringtranslate.com

Variable estática

En programación informática , una variable estática es una variable que ha sido asignada "estáticamente", lo que significa que su duración (o "extensión") es la ejecución completa del programa. Esto contrasta con las variables automáticas de vida más corta , cuyo almacenamiento se asigna y desasigna en la pila de llamadas ; y con los objetos asignados dinámicamente , cuyo almacenamiento se asigna y desasigna en la memoria del montón .

La duración de una variable se contrasta con el ámbito (donde se puede utilizar una variable): "global" y "local" se refieren al ámbito, no a la duración, pero el ámbito a menudo implica duración. En muchos lenguajes, las variables globales son siempre estáticas, pero en algunos lenguajes son dinámicas, mientras que las variables locales son generalmente automáticas, pero pueden ser estáticas.

En general,La asignación de memoria estática es la asignación de memoria entiempo de compilación, antes de que se ejecute el programa asociado, a diferencia dela asignación de memoria dinámicaola asignación de memoria automática, donde la memoria se asigna según sea necesario entiempo de ejecución.[1]

Historia

Las variables estáticas datan al menos de ALGOL 60 (1960), donde se conocen como variables propias :

Una declaración puede marcarse con el declarador adicional own. Esto tiene el siguiente efecto: al volver a ingresar al bloque, los valores de las magnitudes own no cambiarán con respecto a los valores que tenían en la última salida, mientras que los valores de las variables declaradas que no estén marcadas con own no estarán definidos.

—  Informe revisado sobre ALGOL 60, sección “5. Declaraciones”, pág. 14

Esta definición es sutilmente diferente de una variable estática: solo especifica el comportamiento y, por lo tanto, la duración de vida, no el almacenamiento: una variable propia se puede asignar cuando se llama a una función por primera vez, por ejemplo, en lugar de en el momento de carga del programa.

El uso de la palabra estática para referirse a estas variables data al menos de BCPL (1966), y se popularizó gracias al lenguaje de programación C , que recibió una gran influencia de BCPL. La definición de BCPL dice:

(1) Elementos de datos estáticos:
aquellos elementos de datos cuya extensión dura tanto como el tiempo de ejecución del programa; dichos elementos de datos tienen valores L constantes manifiestos. Cada elemento de datos estático debe haber sido declarado en una definición de función o rutina, en una declaración global o como una etiqueta establecida por dos puntos.

—  Manual de referencia de BCPL, 7.2 Asignación de espacio y extensión de los elementos de datos

Tenga en cuenta que BCPL definió un "elemento de datos dinámico" para lo que ahora se llama una variable automática (local, asignada a la pila), no para objetos asignados al montón, que es el uso actual del término asignación dinámica .

La staticpalabra clave se utiliza en C y lenguajes relacionados tanto para variables estáticas como para otros conceptos.

Direccionamiento

El modo de direccionamiento de dirección absoluta solo se puede utilizar con variables estáticas, porque esos son los únicos tipos de variables cuya ubicación conoce el compilador en el momento de la compilación. Cuando el programa ( ejecutable o biblioteca ) se carga en la memoria, las variables estáticas se almacenan en el segmento de datos del espacio de direcciones del programa (si se inicializa), o en el segmento BSS (si no se inicializa), y se almacenan en las secciones correspondientes de los archivos de objeto antes de la carga.

Alcance

En términos de alcance y extensión , las variables estáticas tienen alcance durante toda la ejecución del programa, pero pueden tener un alcance más limitado . Una distinción básica es entre una variable global estática , que tiene alcance global y, por lo tanto, está en contexto durante todo el programa, y ​​una variable local estática , que tiene alcance local. Una variable local estática es diferente de una variable local ya que una variable local estática se inicializa solo una vez sin importar cuántas veces se llame a la función en la que reside y su valor se conserva y es accesible a través de muchas llamadas a la función en la que se declara, por ejemplo, para usarse como una variable de conteo. Una variable estática también puede tener alcance de módulo o alguna variante, como el enlace interno en C , que es una forma de alcance de archivo o alcance de módulo.

Ejemplo

Un ejemplo de una variable local estática en C:

#incluir <stdio.h> void Func () { static int x = 0 ; // |x| se inicializa solo una vez en cinco llamadas de |Func| y la variable // se incrementará cinco veces después de estas llamadas. El valor final de |x| // será 5. x ++ ; printf ( "%d \n " , x ); // genera el valor de |x| }              int main () { Func (); // imprime 1 Func (); // imprime 2 Func (); // imprime 3 Func (); // imprime 4 Func (); // imprime 5             devuelve 0 ; } 

Programación orientada a objetos

En la programación orientada a objetos , también existe el concepto de variable miembro estática , que es una " variable de clase " de una clase definida estáticamente, es decir, una variable miembro de una clase dada que se comparte entre todas las instancias (objetos) y es accesible como una variable miembro de estos objetos. Una variable de clase de una clase definida dinámicamente, en lenguajes donde las clases se pueden definir en tiempo de ejecución, se asigna cuando se define la clase y no es estática.

Las constantes de objeto conocidas en tiempo de compilación, como los literales de cadena , suelen asignarse de forma estática. En la programación orientada a objetos, las tablas de métodos virtuales de las clases suelen asignarse de forma estática. Un valor definido estáticamente también puede ser global en su alcance, lo que garantiza que se utilice el mismo valor inmutable durante toda la ejecución para mantener la coherencia.

Véase también

Notas

  1. ^ Jack Rons. "¿Qué es la asignación de memoria estática y la asignación de memoria dinámica?". MeritHub [An Institute of Career Development] . Consultado el 16 de junio de 2011 . El compilador asigna el espacio de memoria necesario para una variable declarada. Al utilizar el operador addressof, se obtiene la dirección reservada y esta dirección puede asignarse a una variable de puntero. Dado que la mayoría de las variables declaradas tienen memoria estática, esta forma de asignar un valor de puntero a una variable de puntero se conoce como asignación de memoria estática. La memoria se asigna durante el tiempo de compilación.[ enlace muerto ]

Referencias