2010-09-10 40 views

Respuesta

50
  • variables locales se pueden almacenar ya sea en la pila o en un segmento de datos dependiendo de si son auto o estática. (Si no se especifica de forma explícita ni automático o estático, se supone automático)

  • variables globales se almacenan en un segmento de datos (a menos que el compilador puede optimizar a la basura, consulte const) y tienen la visibilidad desde el punto de declaración de el final de la unidad de compilación.

  • variables estáticas se almacenan en un segmento de datos (de nuevo, a menos que el compilador puede optimizar a la basura) y tienen visibilidad desde el punto de la declaración al final del ámbito de encerramiento. Las variables globales que no son estáticas también son visibles en otras unidades de compilación (ver extern).

  • auto Las variables son siempre locales y se almacenan en la pila.

  • El modificador le dice al compilador que haga todo lo posible para mantener la variable en un registro si es posible. De lo contrario, se almacena en la pila.

  • extern variables se almacenan en el segmento de datos. El modificador externo le dice al compilador que una unidad de compilación diferente está declarando realmente la variable, por lo que no cree otra instancia de la misma o habrá una colisión de nombre en el tiempo del enlace.

  • const Las variables se pueden almacenar en la pila o en un segmento de datos de solo lectura, en función de si son automáticas o estáticas. Sin embargo, si el compilador puede determinar que no se puede hacer referencia a ellos desde una unidad de compilación diferente, o que su código no usa la dirección de la variable const, es libre de optimizarla (cada referencia puede ser reemplazada por el valor constante) . En ese caso, no está almacenado en ningún lado.

  • la volátil modificador indica al compilador que el valor de una variable puede cambiar en cualquier momento a partir de las influencias externas (por lo general de hardware) por lo que no se debe tratar de optimizar la basura cualquier recargas de memoria en un registro cuando se hace referencia a esa variable . Esto implica almacenamiento estático.

Por cierto todo esto se aplica a C & C++, así como Objective-C.

+0

Por "segmento de texto" quiere decir "segmento de datos", excepto cuando se habla de consts. – JeremyP

+0

@JeremyP - sí, por supuesto :-) – Ferruccio

+0

¡Genial! +1 por la brillante respuesta. ¡Será más perfecto si menciona la memoria de pila y el puntero en este contexto! –

2

Las variables locales generalmente se almacenan en la pila, y las variables globales en el segmento de "texto" de un programa (en el caso de constantes de cadena) o en el montón si están dinámicamente asignadas. Las variables automáticas se usan generalmente en funciones/métodos, y generalmente se pasan en la pila (a veces en registros, también, dependiendo de la arquitectura). Las variables de registro se almacenaron una vez en registros, pero la mayoría de los compiladores ignoran actualmente la palabra clave register y la colocan donde lo consideren apropiado: en la pila o en un registro. Los miembros externos, const y volátiles son modificadores y, por lo tanto, no tienen un lugar definitivo donde se almacenan.

Por lo tanto, la respuesta breve es, como de costumbre, "depende".

5

Las variables locales y auto se almacenan en la pila. Las variables globales y static se almacenan en una página de DATOS. register las variables se almacenan en un registro en la CPU si es posible, de lo contrario en la pila. extern, const y volatile no especifican dónde se almacena la variable; la variable se almacena donde los demás especificadores de almacenamiento dicen que están.

+1

los segmentos de texto son normalmente de solo lectura. Las variables globales estarán en un segmento de datos. – JeremyP

+0

@JeremyP: Estás en lo correcto, un pequeño mindslip allí. –

11

¿A qué nivel de abstracción está buscando una respuesta?

En el nivel físico, probablemente todos estén almacenados en capacidades de compuerta y dominios magnéticos. (Tal vez incluso los fotones si su disco de intercambio está conectado wifi o fibra óptica)

En un nivel de hardware, las copias de cualquiera y todas estas variables pueden existir en varios lugares del registro, caché de datos (quizás en niveles múltiples) , memoria principal y/o jerarquía de almacenamiento, desde completamente intercambiado a un disco o almacenamiento NV (dependiendo de la existencia, implementación y estado actual de cualquier subsistema de memoria virtual con paginación demandada), hasta quizás todo en registros si el tamaño de sus aplicaciones y la vida es lo suficientemente pequeña.

Dadas las implementaciones más habituales del compilador y el tiempo de ejecución, la memoria (quizás virtual) se divide en elementos llamados pilas y montones. Dada la definición formal del lenguaje, este corte puede o no ser necesario.

En el nivel de optimización del compilador, muchas de estas variables pueden haberse optimizado para que no existan. No están almacenados en ningún lugar excepto como una abstracción.

+0

+100 Desearía poder votar tan a menudo como sea necesario para que esta sea la respuesta más votada :) – pmg

+0

Me gusta más la abstracción. –

1

LOCAL- Variables locales con qué alcance se encuentra en la función. Puede haber dos tipos auto o estáticos. Si se declara simplemente int var.Compiler tratar como clase de almacenamiento automático. Las variables automáticas se almacenan en Pila. Las variables estáticas se almacenan en el segmento de datos.

Las variables de registro se almacenan en la CPU. Si no hay registros disponibles para almacenar variables, entonces el compilador trata como variable automática.

Las variables globales se almacenan en el área Segmento de datos.

Las variables const se almacenan en el área de solo lectura. Es el área del segmento de código de memeory.

Cuestiones relacionadas