Disponible la nueva versión "donationware" 7.3 de OrganiZATOR
Descubre un nuevo concepto en el manejo de la información.
La mejor ayuda para sobrevivir en la moderna jungla de datos la tienes aquí.

Curso C++

[Home]  [Inicio]  [Índice]


4.1.8  Especificadores de clase de almacenamiento

§1  Sinopsis

Los especificadores de clase de almacenamiento, también llamados especificadores de tipo, establecen el tipo (sitio) de almacenamiento de las entidades declaradas y su duración.

C++ dispone de los siguientes: auto,   register,   static,   externmutable y   ( 3.2.1a) que son de tipo general.   Además existe un especificador especial, la directiva inline, que solo se utiliza con funciones ( 4.4.6b).

Nota:  C++Builder tiene un especificador especial: __declspec


Recordemos ( 2.2.6) que el almacenamiento puede realizarse en cuatro sitios distintos:  el segmento de datos, el registro, el montón o la pila.  Recordemos también que puede establecerse de tres formas:

  • De forma explícita, mediante la sintaxis de la declaración (utilizando alguno de los especificadores anteriores). 
  • De forma implícita, por la situación de la declaración en el código.
  • Por mezcla de ambas.
Ejemplo:

A continuación se esquematizan las diversas formas de definir las clases de almacenamiento, tanto explícita como implícitamente.

#include <iostream.h>

   typedef char* M_CARACTER;
   extern int arr1[];               // L.4:
  const M_CARACTER ptr = "Introduzca cantidad (Intro para terminar):";
  void fun1(int);                  // L.6:
  void fun2(char*, int);
int main() {                         // ============
  auto int x;                        // L.9:
  M_CARACTER arr2 = new char[5];     // L.10:
  cout << ptr << endl;
  cin >> x;
  if (x != 0) {
    fun1(x);
    fun2(arr2, 5);                   // L.15
  }
  delete[] arr2;                     // L.17:

  return 0;
}

void fun1 (int n) {
  static total = 0;                  // L.22:
  register int i;                    // L.23:
  for (i = 1; i <= n; i++) cout << "Repetimos!" << endl;
  if ( n > 0) total++;
}
inline void fun2 (char a[], int n) { // L.27
  auto int x = n;                    // L.28

  a[x] = static_cast<char>(x+64);
}

Comentario:

La matriz arr1 de L.4 se declara extern, no es necesario indicar su tamaño, se supone que está definida en otro módulo del programa (otro fichero).

El puntero ptr declarado en L.5 es una variable de carácter global, por tanto de carácter persistente, y posiblemente sea almacenada en el segmento de datos;  Aunque se trata de una variable, en este momento señala a una cadena literal de caracteres constantes.  Esta cadena es creada en el momento de la compilación y no es seguro que tenga un Lvalue, es decir, puede estar almacenada junto con el código del programa e el segmento de código ("code segment").

La variables x de L.9 y L.28 se declaran auto. Este especificador es realmente innecesario en ambos casos, porque de cualquier modo son de naturaleza automática y serán destruidas en cuanto las respectiva funciones main y fun2 salgan de ámbito.

La sentencia L.10 crea la variable arr2 que es un puntero a carácter creado en la pila. Señala a un espacio de 20 bytes creado en el montón. Se trata de un objeto persistente cuyo espacio hay que desasignar explícitamente en L.17  (hay una exposición más detallada sobre este punto en 4.3.3).

La variable total es también de un objeto persistente, aunque en este caso se declara explícitamente en L.22, mientras que la persistencia de la zona de memoria señalada por arr2 se declara implícitamente.

El contador de bucle i de func1 se declara variable de registro (L.23); esta es una utilización típica para este tipo de variables.

La función func2 se declara inline, lo que supone el compilador sustituirá su invocación en L.15 por un trozo de código equivalente.