2008-09-18 7 views

Respuesta

28

El especificador de clase de almacenamiento controla el almacenamiento y la vinculación de sus variables. Estos son dos conceptos que son diferentes. C especifica los siguientes especificadores para las variables: auto, extern, register, static.

almacenamiento
La duración de almacenamiento determina el tiempo que la variable vivirá en la memoria RAM.
Hay tres tipos de duración de almacenamiento: estática, automática y dinámica.

estática
Si la variable se declara en el ámbito de archivo, o con un extern o especificador estática, que tendrá almacenamiento estático. La variable existirá mientras el programa se esté ejecutando. No se emplea tiempo de ejecución para crear estas variables.

automática
Si la variable se declara en una función, pero sin la extern o especificador estática, que tiene el almacenamiento automático. La variable existirá solo mientras estás ejecutando la función. Una vez que regrese, la variable ya no existe. El almacenamiento automático normalmente se realiza en la pila. Es una operación muy rápida para crear estas variables (simplemente incremente el puntero de la pila por el tamaño).

dinámica
Si utiliza malloc (o nueva en C++) que está utilizando el almacenamiento dinámico. Este almacenamiento existirá hasta que llame gratis (o elimine). Esta es la forma más costosa de crear almacenamiento, ya que el sistema debe administrar la asignación y la desasignación de forma dinámica.

Vinculación
Vinculación especifica que puede ver y hacer referencia a la variable. Hay tres tipos de enlaces: vinculación interna, vinculación externa y sin vinculación.

ninguna vinculación
Esta variable sólo es visible donde se declaró. Normalmente se aplica a las variables declaradas en una función.

enlace interno
Esta variable será visible para todas las funciones dentro del archivo (llamado translation unit), pero otros archivos no sabrán que existe.

enlazado externo
La variable será visible a otras unidades de traducción. A menudo se los considera como "variables globales".

Aquí es una tabla que describe las características de almacenamiento y de vinculación en función de los especificadores

 
    Storage Class Function   File 
    Specifier  Scope    Scope 
----------------------------------------------------- 
    none   automatic   static  
       no linkage  external linkage 

extern   static   static 
       external linkage external linkage 

static   static   static 
       no linkage  internal linkage 

    auto   automatic   invalid 
       no linkage 

register   automatic   invalid 
       no linkage 
+1

Quizás debería incluir un poco más de detalle en las unidades de traducción, ya que no son solo archivos ... son archivos fuente más los encabezados incluidos en ellos (aunque indirectamente) – workmad3

+1

Vaya ... +1. Tenga en cuenta que "auto" cambiará su significado con C++ 0x: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal

+0

Actualización para C++ 11: duración del almacenamiento de subprocesos. El objeto se asigna cuando el hilo comienza y se desasigna cuando termina el hilo. Cada hilo tiene su propia instancia del objeto. Solo los objetos declarados thread_local tienen esta duración de almacenamiento. thread_local puede aparecer junto con static o extern para ajustar el enlace. – czxyl

0

clases de almacenamiento variable o especificadores de tipo (como volátiles, automático y estático) definen cómo/donde las variables se guardan durante la ejecución del programa. Por ejemplo, las variables definidas en funciones generalmente se guardan en la pila, lo que significa que se perderán después de que la función regrese. Al usar la palabra clave "estática", puede forzar al compilador a poner la variable en el segmento de datos en la memoria, haciendo que el contenido de las variables sea persistente entre las llamadas a esa función. La palabra clave "registrar" hará que el compilador intente lo más posible para poner la variable en un registro de la CPU, útil para contadores en bucles, etc. Sin embargo, no está garantizado que en realidad esté en un registro después de todo.

Más información sobre los tipos de especificadores here.

+0

Para una extraña definición de "intentar lo más posible", que generalmente significa "no hacer nada". 'register' es completamente obsoleto excepto para documentar (por aplicación) que su código no puede tomar la dirección de una variable. –

Cuestiones relacionadas