Bienvenidos sean a este post, hoy hablaremos un poco sobre la memoria.
Cuando hablamos de variables en este post dijimos que se reserva un espacio en memoria para guardar el dato de la misma pero no comentamos como es la misma, la memoria principalmente se divide en dos partes:
- Stack
- Heap
Dependiendo del tipo de variable se almacenara en una parte o la otra, en general todos los tipos primitivos (int, float, booleano) se ubican en la seccion stack debido a que son las formas mas basicas de informacion que usaremos, en cambio las derivadas de clases (vector, arrays, String) se almacenaran en el heap porque necesitan mas espacio pero de eso hablaremos en otro post porque hoy nos centraremos en la primera parte, vamos a enumerar algunas caracteristicas de stack:
- Es increiblemente rapido
- Tiene poco espacio con respecto a heap
- El dato se almacena mientras la funcion este corriendo
Por esta razon muchas veces debemos tener cuidado con el tamaño de las funciones, asi como la cantidad de variables que almacenaremos en esta seccion, si bien hoy en dia no es uno de los principales problemas este aun existe y puede ocurrir, por ejemplo en todos los casos siempre vimos que tenemos como minimo una funcion o metodo llamada main, con sus respectivas variables y llamadas a otras funciones, en cualquiera de esos casos una vez que finaliza main esta libera todo el espacio utilizado.
Vamos a estudiar un poco el concepto de como trabaja, para entenderlo vamos a tomar el siguiente codigo como ejemplo:
fn main
{
let i = 32;
}
Aqui simplemente creamos una variable dentro de main, si lo tuvieramos que ver en memoria seria algo similar a esto:
Funcion | Direccion | Variable | Valor |
main | 0 | i | 32 |
Mientras main no termine esto existira en memoria, vamos a suponer que ahora agregaremos la siguiente funcion en nuestro codigo anterior:
fn funcion()
{
let a = 10;
let b = 15;
}
fn main
{
let i = 32;
}
El hecho de agregarlo no significa que se cargue en memoria dado que mientras no llamemos a la nueva funcion esta simplemente estara definida en el codigo pero el compilador no vera necesaria asignarla en memoria y tendriamos un cuadro similar al anterior, modifiquemos el codigo anterior de la siguiente manera:
fn funcion()
{
let a = 10;
let b = 15;
}
fn main
{
let i = 32;
funcion();
}
Aqui si llamamos a la funcion en el main, por lo tanto ahora si miramos la memoria la tendremos de la siguiente forma:
Funcion | Direccion | Variable | Valor |
funcion | 2 | a | 15 |
funcion | 1 | b | 10 |
main | 0 | i | 32 |
Si bien las direcciones de memoria no seran exactamente estas sino que son un simple ejemplo, siempre la de main sera la primera o la de inicio, el resto se iran ubicando en un orden y direccion dependiendo de como se cargan, estas a su vez existiran mientras existan la funcion, por ejemplo una vez terminada la funcion y que quede solamente main volveremos al cuadro anterior y una vez finalizado main nos quedara completamente vacio.
Todo este ciclo ocurrira a medida que utilicemos mas funciones, es decir que se seguiran apilando en este seccion pero a medida que se vayan terminando iran desapareciendo porque como mencionamos tiene un capacidad muy baja con respecto a la otra seccion.
En resumen, hoy hemos visto como trabaja una parte de la memoria, la parte conocida como stack o en algunas ocasiones como memoria baja, hemos visto sus caracteristicas, y a traves de un par de ejemplos como almacena la informacion y como la proccesa una vez finalizada la funcion, espero les haya sido de utilidad sigueme en tumblr, Twitter o Facebook para recibir una notificacion cada vez que subo un nuevo post en este blog, nos vemos en el proximo post.


Donación
Es para mantenimento del sitio, gracias!
$1.50
