Clases de almacenamiento de una variable

ruedasPor defecto, todas las variables llevan asociada una clase de almacenamiento que determinan su accesibilidad y existencia. Estos conceptos de accesibilidad y existencia de las variables pueden alterarse por los calificadores:

  • auto.- almacenamiento automático.
  • register.- almacenamiento en un registro.
  • static.- almacenamiento estático.
  • extern.- almacenamiento externo.

Los calificadores auto y register solo se pueden usar con variables locales, el comando extern sólo se usa con variables globales y el calificador static puede ser utilizado con variables globales y variables locales.

Calificación de variables globales

Una variable declarada a nivel global es una definición de la variable o una referencia a una variable definida en otra parte. Las variables definidas a nivel global sin iniciadas a 0 por omisión.

Una variable global puede hacerse accesible antes de su definición o en otro fichero fuente, utilizando el calificador extern. Esto quiere decir que el calificador extern se utiliza para hacer visible una variable global allí donde no lo sea.

Este ejemplo lo forman dos ficheros fuente, uno.cpp y dos.cpp, que muestra con claridad lo dicho anteriormente.

Listado uno.cpp:

globales_uno_cpp_listado

y el listado dos.cpp:

globales_dos_cpp_listado

Compilamos los dos archivos con el nombre del ejecutable var y ejecutamos:

globales_uno_dos_cpp_salida

Vemos que el programa anterior esta formado por los ficheros fuente uno.cppdos.cpp:

1.-

declaraciones_grafico_1

2.-

declaraciones_grafico_2

3.-

declaraciones_grafico_3

Si omitiéramos la declaración extern, la variable global var no sería accesible en la función main.

4.-

 declaraciones_grafico_4Si la variable var no hubiera sido iniciada explícitamente, C++ le asignaría el valor de 0 por ser una variable global.

Si se utiliza el calificador static en la declaración de una variable a nivel global, ésta será accesible solamente dentro de su propio fichero fuente. Esto permite declarar otras variables con el mismo nombre en otros ficheros correspondientes al mismo programa. Como ejemplo sustituimos en el fichero dos.cpp del programa anterior, el calificador extern por static.

stacit_listado

Vemos que en vez de mostrar 6, 7, 8:

globales_uno_dos_cpp_salida

Ahora mostrará distinto resultado, 6, 7, 1:

static_1

Esto demuestra que el calificador static restringe el acceso a la variable al propio fichero fuente.

 Calificación de variables locales

 Si declaramos una variable local como auto (variable automática) solo será visible dentro del bloque donde está devinida. Este tipo de variables no son iniciadas automáticamente, por lo que debemos iniciarlas explícitamente. Se recomienda iniciarlas siempre.

La variable local declarada static solamente es visible dentro del bloque donde está definida, pero a diferencia de auto, su existencia es permanente, en lugar de aparecer y desaparecer al iniciar y finalizar la ejecución del bloque que lo contiene.

Una variable declarada static es declarada solamente una vez, cuando se ejecuta el código que la define, y no es reiniciada cada vez que se ejecuta el bloque que la contiene, sino que la siguiente ejecución del bloque comienza con el valor que tenía la variable cuando finalizó la ejecución anterior. Si la variable no es iniciada explícitamente C++ la inicia automáticamente a 0.

Una variable declarada register es una recomendación al compilador para que almacene dicha variable, si es posible, en un registro de la máquina, lo que producirá programas más cortos y más rápidos. El número de registros utilizables para este tipo de variables depende de la máquina. Si no es posible almacenar una variable register en un registro, se le da el tratamiento de automática. En este tipo de declaración es válido para variables de tipo int y de tipo puntero, debido al tamaño del registro.

Una variable declarada extern a nivel local hace referencia a una variable definida con el mismo nombre a nivel global en cualquier parte del programa. La finalidad de extern en este caso es hacer accesible una variable global, en un bloque donde no lo es.

Veamos un ejemplo:

declaracion_listado

La salida sería:

variables4_salida

Desglosemos el programa

declaracion_1

declaracion_2

declaracion_3

La clase de almacenamiento de var3 es register y la de var4 es auto.

declaracion_4

declaracion_5

declaracion_6

atras2

 

 

Deja un comentario

Este sitio utiliza Akismet para reducir el spam. Conoce cómo se procesan los datos de tus comentarios.