TransWikia.com

Cuando declaro una variable, ¿Le estoy asignando una espacio en memoria o primero la tengo que inicializar?

Stack Overflow en español Asked by Juan Diego Valdivia Mendoza on August 27, 2021

int x; //declarando una variable 
x = 5; //inicializando una variable
int y = 6 //declarando e inicializando una variable 

¿Ocupa espacio en memoria cuando la declaro? ¿o todavía no?

2 Answers

¿ Ocupa espacio en memoria cuando la declaro ?

Depende.

Teoría

La especificación del lenguaje determina que es posible obtener la dirección en memoria de cualquier variable (a diferencia de C, no es posible declarar variables register) antes de asignarle ningún valor. Con lo cual, la respuesta sería ocupan espacio en memoria desde que las declaras.

Práctica

Variables no-automáticas

Este tipo de variable es algo complejo: pueden declararse e inicializarse en archivos distintos ... con lo que conceptos tales como declaración o asignación no terminan de estar tan claros como pareciera ... y mas aun si tenemos en cuenta que, desde C++14, dichas variables pueden ser plantillas, y desde C++17, dichas variables se pueden declarar inline ... y, en todo caso, se inicializan a 0 si no les proporcionas un valor de forma explícita.

Cuando declaras una variable de este tipo, el compilador entiende que es una promesa por tu parte:

extern int X;

estás diciendo Mira, compilador. En alguna parte, en otro archivo, hay una variable de nombre X. Palabra de programador.

Estas declaraciones han de complementarse con instanciaciones: tienes que cumplir tu palabra:

int X = 10;

Pero ambas partes puede ir en archivos distintos, así que ... pueden darse casos curiosos; por ejemplo, si instancias int x = 10, pero no la declaras en ningún sitio ... ¡ la variable existe antes de que la declares !

En todo caso, este tipo de variables reservan su espacio antes incluso de que entres en tu función main( ) ... ¡ su sola instanciación permite viajar en el tiempo !

Variables automáticas

Seguro que todos conocemos el famoso experimento mental del gato de schrödinger:

introducir la descripción de la imagen aquí Tomada de La Wikipedia

Viene a decir que, en determinados sucesos, pueden darse varias situaciones de forma simultánea, y que es el propio hecho de comprobar (observar) la situación el que fuerza el colapso a un estado determinado.

Pues, con las variables automáticas, pasa algo parecido.

Ante una declaración

int x;

el compilador puede decidir que no es necesaria, aunque se le asigne un valor inicial int x = 10;

Las capacidades de optimización de los compiladores modernos son abrumadoras, y, si llega a la conclusión de que dicha variable no se utiliza, y su construcción/destrucción no conlleva efectos colaterales, puede decidir no crearla.

Por lo tanto, tenemos una paradoja: el estándar dicta que si ... pero el compilador decide que no, por lo que la variable se encuentra en ambos estados a la vez. Existe ... ¡ y no existe !

En estos casos, es el compilador el que decide. Podemos realizar acciones para inclinar su decisión en uno u otro sentido: obtener su dirección (con &), declararla volatile, usarla como argumento de una función extern, declararla como const, que sea una instancia de una clase con efectos laterales en su constructor/destructor (incluidos el que sean extern), ...

Ahondando

Hasta donde se, el espacio necesario para las variables automáticas se reserva al entrar a la función (no tengo claro si el ABI influye en esto). Pero, como casi todo en esta vida ... con matices:

int foo( ) {
  int A = 0;

  {
    float B = 0.0f;
    A += funct2( B );
  }

  {
    double C = 10.0;
    A += funct3( C );
  }

  return A;
}

Observa que el espacio ocupado por B y C puede solaparse. Puesto que son variables con ámbitos distintos, el compilador puede decidir que no vale la pena ocupar espacio de forma individual para ambas; puesto que C ocupa mas espacio, puede reservar solo el necesario para A y C, compartiendo este último con B.

Nota: durante la escritura de esta texto, no se hizo daño a ningún gatito

Answered by Trauma on August 27, 2021

¿Ocupa espacio en memoria cuando la declaro?

Puedes consultar el tamaño de una variable usando el operador sizeof():

std::cout << sizeof(x);

Este operador te devuelve el tamaño en bytes de cualquier variable y éste valor se calcula en tiempo de compilación.

En cualquier caso, en el momento en el que declaras una variable ya puedes almacenar un valor en ella. Es facil ver que para poder almacenar un valor en una variable se hace necesario que dicha variable tenga una región de memoria donde almacenar dicho valor. Por tanto es en el momento de la declaración cuando la variable ya ocupa espacio en el sistema.

Answered by eferion on August 27, 2021

Add your own answers!

Ask a Question

Get help from others!

© 2024 TransWikia.com. All rights reserved. Sites we Love: PCI Database, UKBizDB, Menu Kuliner, Sharing RPP