¿Dónde se almacenan las variables locales, globales, estáticas, automáticas, de registro, externas, constantes y volátiles?

5 minutos de lectura

Avatar de usuario de Matrix
Matriz

¿Dónde se almacenan las variables locales, globales, estáticas, automáticas, de registro, externas, constantes y volátiles?

  • ¿En la memoria…?

    – BoltClock

    10 de septiembre de 2010 a las 12:59

Avatar de usuario de Ferruccio
Ferruccio

  • local las variables se pueden almacenar en la pila o en un segmento de datos dependiendo de si son automáticas o estáticas. (si no se especifica explícitamente ni auto ni static, se asume auto)

  • global las variables se almacenan en un segmento de datos (a menos que el compilador pueda optimizarlas, ver const) y tienen visibilidad desde el punto de declaración hasta el final de la unidad de compilación.

  • estático las variables se almacenan en un segmento de datos (nuevamente, a menos que el compilador pueda optimizarlas) y tienen visibilidad desde el punto de declaración hasta el final del alcance adjunto. 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.

  • la Registrarse 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.

  • externo Las variables se almacenan en el segmento de datos. El modificador externo le dice al compilador que una unidad de compilación diferente está declarando la variable, así que no cree otra instancia o habrá una colisión de nombres en el momento del enlace.

  • constante las variables se pueden almacenar en la pila o en un segmento de datos de solo lectura, dependiendo 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 está usando la dirección de la variable const, es libre de optimizarla (cada referencia puede ser reemplazada por el valor constante) . En ese caso no se almacena en ningún lado.

  • la volátil El modificador le dice al compilador que el valor de una variable puede cambiar en cualquier momento debido a influencias externas (generalmente hardware), por lo que no debe intentar optimizar ninguna recarga de la memoria en un registro cuando se hace referencia a esa variable. Esto implica almacenamiento estático.

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

  • Por “segmento de texto” te refieres a “segmento de datos”, excepto cuando se habla de constantes.

    – JeremyP

    10 de septiembre de 2010 a las 13:58

  • ¡Excelente! +1 por la brillante respuesta. ¡Será más perfecto si menciona la memoria del montón y el puntero en este contexto!

    – Arun Chettoor

    10 de enero de 2015 a las 11:48

avatar de usuario de hotpaw2
pata caliente2

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

A nivel físico, probablemente todos estén almacenados en capacitancias de puerta y dominios magnéticos. (Tal vez incluso fotones si su disco de intercambio está conectado a Wi-Fi o fibra óptica).

En un nivel de hardware, pueden existir copias de todas y cada una de estas variables en varios lugares del registro, caché de datos (quizás en múltiples niveles), memoria principal y/o jerarquía de almacenamiento, todo, desde completamente intercambiado en disco o memoria no volátil almacenamiento (dependiendo de la existencia, la implementación y el estado actual de cualquier subsistema de memoria virtual paginado por demanda), hasta tal vez todo en los registros si el tamaño y la vida útil de su aplicación son lo suficientemente pequeños.

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

En el nivel de optimización del compilador, muchas de estas variables pueden haber sido optimizadas hasta desaparecer. No se almacenan en ningún lugar excepto como una abstracción.

  • +100 Desearía poder votar tan a menudo como sea necesario para que esta sea la respuesta más votada 🙂

    – pmg

    10 de septiembre de 2010 a las 18:07

  • Me gusta más la parte de abstracción.

    – Praveen S.

    11 de septiembre de 2010 a las 6:54

Avatar de usuario de Ignacio Vázquez-Abrams
Ignacio Vázquez-Abrams

locales y auto Las variables se almacenan en la pila. globales y static las variables 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, consty volatile no especifique dónde se almacena la variable; la variable se almacena donde los otros especificadores de almacenamiento dicen que están.

  • los segmentos de texto normalmente son de sólo lectura. Las variables globales estarán en un segmento de datos.

    – JeremyP

    10 de septiembre de 2010 a las 13:59

avatar de usuario de mipadi
mipadi

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 las constantes de cadena) o en el montón si se asignan dinámicamente. Las variables automáticas generalmente se usan en funciones/métodos, y generalmente se pasan en la pila (a veces también en registros, dependiendo de la arquitectura). Las variables de registro alguna vez se almacenaron en registros, pero la mayoría de los compiladores hoy en día ignoran la palabra clave de registro y las colocan donde mejor les parezca: en la pila o en un registro. Los miembros extern, const y volatile son modificadores y, por lo tanto, no tienen un lugar definitivo donde almacenarlos.

Así que la respuesta corta es, como siempre, “depende”.

avatar de usuario de kumar123
kumar123

Local

Variables locales cuyo alcance está dentro de la función. Puede ser de dos tipos, auto o estático.

Si se declara simplemente int var, el compilador lo trata como el auto clase de almacenamiento. Las variables automáticas se almacenan en la 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, el compilador las trata como variables automáticas.

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

Las variables constantes se almacenan en el área de solo lectura. Eso es segmento de código área de la memoria.

  • Re “segmento de datos” y “segmento de código”: ¿No está eso restringido a algunos x86 sistemas?

    -Peter Mortensen

    hace 2 días


  • Re “segmento de datos” y “segmento de código”: ¿No está eso restringido a algunos x86 sistemas?

    -Peter Mortensen

    hace 2 días


¿Ha sido útil esta solución?