2009-06-06 29 views
19

Un variable global 's alcance es en todos los archivos, mientras que una variable globalestática' s alcance es sólo el archivo en el que se declara. ¿Porque?Diferencia entre 'global' y 'estática global'

¿Dónde se almacenan las variables globales globales o estáticas en la memoria?

Respuesta

24

Existe cierta confusión, ya que static en C puede significar dos cosas diferentes. Uno es la duración del almacenamiento estático, y el otro es el enlace interno. static utilizado como palabra clave en el alcance del archivo dará la función u objeto que se utiliza con el enlace interno.

La vinculación interna para una función u objeto significa que si declara otra función en otro "archivo" (esto no se llama realmente "archivo", sino unidad de traducción - TU), esa declaración se referirá a Función: el nombre declarado en esa unidad se "vinculará" a una entidad diferente del nombre declarado en esa otra unidad de traducción, que era "interna" a esa TU. Lo mismo se aplica a los objetos.

Independientemente de que se declare o no una variable de ámbito de archivo con static, aún tendrá una duración de almacenamiento estático: eso significa que se almacena en todo el programa y muere cuando finaliza el programa. Otro ejemplo de un objeto que tiene una duración de almacenamiento estática es un literal de cadena. No se especifican los objetos que tienen una duración de almacenamiento estático, pero generalmente se almacenan según se inicialicen o no: las variables de ámbito de archivo inicializadas generalmente se almacenan en una sección llamada ".data", mientras que el archivo no inicializado Las variables de ámbito generalmente se almacenan en una sección llamada ".bss". Recuerde que si la variable no se inicializa, se inicializará en cero al inicio del programa: la sección ".bss" generalmente no se inicializa en cero por una implementación al iniciar el programa.

Dije "habitualmente" en todas partes, ya que no se especifica dónde se almacenan las cosas. Por ejemplo, algunas implementaciones podrían almacenar literales de cadenas en una sección de solo lectura. Y si tiene un puntero de archivo-alcance y no se inicializa, la aplicación inicializa para un nulo-puntero, que no es necesariamente un objeto con todos los bytes nulos :)

+0

¡Esta respuesta parece ser complicada de entender! –

1

El estándar C no especifica dónde están almacenados en la memoria, y no le interesa al programador C. La capacidad de acceder a las variables está controlada por el compilador y el vinculador.

Esta es la segunda pregunta que ha hecho sobre este tema. Una de las razones principales para usar un lenguaje de programación de nivel relativamente alto como C es que no tiene que preocuparse por estos problemas.

+1

como ingeniero de sistemas integrados, creo que debería preocuparme. Y me hicieron la misma pregunta en una entrevista –

17

Ambos se almacenan en el segmento de datos; la diferencia es que el global tiene un símbolo enlazador externo visible, y el global estático no.

7

El ámbito de una variable global está en todos los archivos ... mientras que el alcance de una variable global estática es solo el archivo donde se declara ... ¿por qué?

Se pretende que una variable global sea accesible desde cualquier módulo; esta práctica es considerada como una mala práctica, y debe usarse solo si es absolutamente necesario.

Variables estáticas del archivo (de lo que asumo que está hablando cuando dice "static global") a las rutinas en una sola unidad de compilación (generalmente un archivo) - la razón para esto es limitar su alcance.Al modificar el código que usa la variable, hay un buen límite para ver dónde otras cosas se verán afectadas. También reduce la oportunidad de que haya un choque de nombres.

Al usar variables globales, si sucede que otro conjunto de módulos también usa una variable global con el mismo nombre para un propósito diferente, deberá modificar un conjunto para usar un nombre diferente. Ese problema no existe para las variables estáticas.

4

No se puede acceder a las variables globales estáticas desde otros archivos mientras se puede acceder a las variables globales utilizando la palabra clave extern.

1

Usamos el atributo estático para ocultar las declaraciones de variables y funciones dentro de los módulos, al igual que usaríamos las declaraciones públicas y privadas en Java y C++. Los archivos fuente C desempeñan el papel de módulos. Cualquier variable o función global declarada con el atributo estático es privada para ese módulo. De forma similar, cualquier variable o función global declarada sin el atributo estático es pública y puede accederse por cualquier otro módulo. Aunque es una buena práctica definir como variables o funciones con la palabra clave 'global'.

Ambas variables se almacenan en la sección .data o .bss de un archivo reubicable.

+0

El lenguaje C utilizado por Objective-C no reconoce una palabra clave 'global'. "Nombre de tipo desconocido 'global'". ¿Tiene alguna referencia a una versión de C que sí tiene una palabra clave 'global'? – jk7

1

Puntos para recordar a la grieta Entrevistas Preguntas sobre estático y Global

  1. La memoria asignada a las variables estáticas es sólo una vez, es decir todos los objetos compartidos por los mismos memoria, pero cuando se trata de variables globales se asigna la memoria para cada objeto.
  2. Las variables estáticas y globales difieren en la vida y el alcance. Primero, déjame explicarte qué es vida y alcance. La vida de un objeto determina si el objeto aún está en la memoria, mientras que el alcance del objeto es si puede acceder a la variable por su nombre. A) Es posible que el objeto esté activo, pero no visible (no en el alcance) b) Si un objeto no está activo, sino en alcance (excepto para los objetos asignados dinámicamente donde se refiere a objetos a través de punteros).
  3. La variable global tiene un alcance global, me refiero a que se puede acceder mediante cualquier función, desde cualquier archivo, mientras que la variable estática tiene alcance de archivo, no es posible acceder a la variable desde ningún otro archivo. Esta técnica es útil cuando se quiere hacer, la variable accesible para todas las funciones de ese archivo, pero no las funciones de otro archivo.
Cuestiones relacionadas