En programación informática , una variable estática es una variable que se ha asignado "estáticamente", lo que significa que su vida útil (o "extensión") abarca toda la ejecución del programa. Esto contrasta con las variables automáticas de menor duración , cuyo almacenamiento se asigna y libera en la pila de llamadas ; y con los objetos asignados dinámicamente , cuyo almacenamiento se asigna y libera en la memoria dinámica .
La vida útil de una variable se contrapone a su ámbito (donde se puede usar): "global" y "local" se refieren al ámbito, no a la vida útil, pero el ámbito suele implicar la vida útil. En muchos lenguajes, las variables globales son siempre estáticas, pero en algunos son dinámicas , mientras que las variables locales suelen ser 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ámicaoautomáticadonde la memoria se asigna según se requiere entiempo de ejecución. [ 1 ]
Historia
Las variables estáticas se remontan al menos a ALGOL 60 (1960), donde se las conoce como variables propias :
Una declaración puede marcarse con el declarador adicional own. Esto tiene el siguiente efecto: al volver a entrar en el bloque, los valores de las cantidades own permanecerán sin cambios con respecto a sus valores en la última salida, mientras que los valores de las variables declaradas que no estén marcadas con own serán indefinidos.
— Informe revisado sobre ALGOL 60, sección "5. Declaraciones", pág. 14
Esta definición difiere sutilmente de la de una variable estática: solo especifica el comportamiento y, por lo tanto, el tiempo 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 la carga del programa.
El uso de la palabra "estático" para referirse a estas variables se remonta al menos a BCPL (1966) y ha sido popularizado por el lenguaje de programación C , que estuvo fuertemente influenciado por BCPL. La definición de BCPL dice:
(1) Elementos de datos estáticos: Aquellos elementos de datos cuya extensión dura lo mismo que el tiempo de ejecución del programa; dichos elementos de datos tienen Lvalues constantes manifiestos. Cada elemento de datos estático debe haber sido declarado en la definición de una función o rutina, en una declaración global o como una etiqueta definida 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 denomina una variable automática (local, asignada en la pila), no para objetos asignados en el 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 absoluto solo se puede usar con variables estáticas, ya que son los únicos tipos de variables cuya ubicación conoce el compilador en tiempo de 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 está inicializado) o en el segmento BSS (si no está inicializado), y se almacenan en las secciones correspondientes de los archivos objeto antes de la carga.
Alcance
En términos de alcance y extensión , las variables estáticas tienen extensión 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á presente en todo el programa, y una variable local estática , que tiene alcance local. Una variable local estática se diferencia de una variable local en que se inicializa solo una vez, independientemente de 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 múltiples llamadas a la función en la que se declara, por ejemplo, para usarse como 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 variable local estática en C:
#include <stdio.h>void func () { static int x = 0 ; // x se inicializa solo una vez en cinco llamadas a 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 ); // muestra el valor de x }int main () { func (); // imprime 1 func (); // imprime 2 func (); // imprime 3 func (); // imprime 4 func (); // imprime 5devolver 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. [ 2 ]
Las constantes de objeto conocidas en tiempo de compilación, como los literales de cadena , suelen asignarse estáticamente. En la programación orientada a objetos, las tablas de métodos virtuales de las clases también suelen asignarse estáticamente. Un valor definido estáticamente puede tener un ámbito global, lo que garantiza que se utilice el mismo valor inmutable durante toda la ejecución para mayor consistencia.
Véase también
Notas
- ↑ Jack Rons. "¿Qué es la asignación de memoria estática y la asignación de memoria dinámica?" . MeritHub [Un Instituto de Desarrollo Profesional]. Archivado del original el 11 de junio de 2010. Recuperado el 16 de junio de 2011.
El compilador asigna el espacio de memoria necesario para una variable declarada. Mediante 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.
- ↑ Smith, Michael A. (1993), "Variables y funciones estáticas" , en Smith, Michael A. (ed.), Software orientado a objetos en C++ , Boston, MA: Springer US, pp. 89–93 , doi : 10.1007/978-1-4899-6629-2_7 , ISBN 978-1-4899-6629-2, recuperado el 14 de enero de 2026
Referencias
- Kernighan, Brian W.; Ritchie , Dennis M. (1988). El lenguaje de programación C (2.ª ed.). Upper Saddle River, NJ: Prentice Hall PTR. ISBN 0-13-110362-8.
- El lenguaje de programación C++ (edición especial) de Bjarne Stroustrup (Addison Wesley, 2000; ISBN 0-201-70073-5)
- Gestión de la memoria
- Variable (informática)