Cuando alguien habla de un especificador de clase de almacenamiento de variables, ¿de qué están hablando?
También suelen hablar de vinculación variable en el mismo contexto, ¿qué es eso?¿Cuál es el especificador de vinculación y almacenamiento de una variable?
Respuesta
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
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.
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. –
- 1. inútil especificador de almacenamiento de clase en una declaración vacía
- 2. Cuál es la diferencia entre el especificador de acceso protegido y el interno protegido en C#
- 3. ¿Cuál es la diferencia entre la vinculación estática y dinámica?
- 4. ¿Cuál es el alcance de una variable lambda en C#?
- 5. ¿Cuál es el uso de una variable compartida en VB.NET?
- 6. ¿Cuál es el punto de almacenamiento de instancia en EC2?
- 7. ¿Cuál es la diferencia entre $ VARIABLE y $ {VARIABLE}
- 8. ¿Cuál es el comportamiento del especificador de conversión `p` con el puntero` NULL`?
- 9. ¿Cuál es la diferencia entre "~> 4.0.1", "4.0.1" y ningún especificador de versión en un Gemfile?
- 10. ¿Cuál es la diferencia entre "=" y "=>" y "@variable", "@@ variable" y ": variable" en ruby?
- 11. Inicializando una variable y especificando la dirección de almacenamiento al mismo tiempo: ¿es posible?
- 12. ¿Cuál es la diferencia entre una variable miembro y una variable local?
- 13. ¿Cuál es el especificador de formato para int corto sin signo?
- 14. ¿Qué es un especificador de nombre anidado?
- 15. Especificador de formato de 'long long'
- 16. ¿Cuál es el significado de $ en un nombre de variable?
- 17. ¿cuál es la variable de diseño_mapaje y cómo puedo incluirla?
- 18. ¿Cuál es el uso del especificador de formato% n en C?
- 19. Almacenamiento de salto de línea en una variable php
- 20. ¿Cuál es el tiempo de vida de una variable estática en una función de C++?
- 21. ¿Cuál es la variable @@ de vim?
- 22. ¿Cuál es la mejor manera de declarar una variable global?
- 23. ¿Correlación entre especificador y calificador?
- 24. ¿Cuál es la longitud ideal de una variable URL
- 25. ¿Qué es "vinculación incremental"?
- 26. Cuál es la diferencia en Perl al pasar una variable en una expresión regular entre usar $ variable y $ {variable}
- 27. ¿Cuál es el costo de almacenamiento de una primitiva en caja en Java?
- 28. ¿Cuál es mi cuenta de almacenamiento de tabla Azure?
- 29. ¿Cuál es el alcance variable dentro de la cadena `class_eval`?
- 30. ¿Cuál es la diferencia entre una propiedad y una variable de instancia?
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
Vaya ... +1. Tenga en cuenta que "auto" cambiará su significado con C++ 0x: http://en.wikipedia.org/wiki/C%2B%2B0x – paercebal
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