Memoria en Zig
06 nov 2025
Bloques de memoria
Cada proceso tiene una vista virtual de la memoria dividia en bloques.
Static
static
-------------------------
| | |
| | |
| | |
-------------------------
0x1000 0x1001 0x1002
Estas regienos de memoria guardan informacion
que no van a cambiar, como el caso de las constantes.
Static se le conoce como Static live time. La vida de
esos valores dura mientras el programa este en ejecucucion.
Nivel de contenedor
Variables y constantes a nivel contenedor, o globales, se almacenan en el bloque Static
::: {#cb2 .sourceCode}
const c: u8 = 42;
var v: u8 = 13;
// ----------------------------------
// c: u8 | v: u8 | |
// 42 | 13 | |
// | | |
// ----------------------------------
// 0x1000 0x1001 0x1002
// Como cada de esos datos en memoria ocupan 8bytes y hay 2 entonces
// en la memoria seria 16bits o 2 bytes.
:::
Constantes
Las constantes siempre se almacenan en el bloque Static no importa si son globales o locales.
::: {#cb3 .sourceCode}
fn f(a: u8, b: u8) {
const c: u8 = 13;
}
// Static
// ----------------------------------
// c: u8 | | |
// 13 | | |
// | | |
// ----------------------------------
// 0x1000 0x1001 0x1002
// Stack
// ----------------------------------
// a: u8 | b: u8 | |
// 1 | 2 | |
// | | |
// ----------------------------------
// 0xff00 0xff01 0xff02
// Los parametros de la funcion siempre van al frame de funcion
// pero para las connstantees van para el static. En el scope de
// esa funcion si va estar disponible la constante, pero su direccion
// de memoria va esta siempre en el static. 1 byte en el area de static
// y 2 bytes en el funcion stack frame.
:::
Heap
heap
-------------------------
| | |
| | |
| | |
-------------------------
0x7700 0x7701 0x7702
-> Direcciones aumentan
Esta es un area de memoria donde haremos asignaciones diammicas o allocator.
Asignacion al heap
Cuando usamos un allocator en zig, el espacion que se asigna esta en el heap y solo es accesible por medio de un puntero.
::: {#cb5 .sourceCode}
const ptr: *u8 = try allocator.create(u8);
// El metodo create se le pasa el tipo de dato, este se utilizaa
// cuando queremos hacer una asignacion de 1 solo elemento, en este caso
// 1 byte.
// El try es porque puede fallar, porque si en caso el proceso se quede sin memoria.
// Estas funcones de allocator siempre regresan punteros.
// Static
// ----------------------------------
// ptr: *u8 | | |
// 0x7700 | | |
// | | |
// ----------------------------------
// 0x1000 0x1001 0x1002
// Heap
// ----------------------------------
// u8 | | |
// | | |
// | | |
// ----------------------------------
// 0x7700 0x7701 0x7702
// En el caso de static al puntero ser const, pues esta se
// guarda en el espacion de memoria de static, pero guarda
// la direccion de memoria en la reguion del heap donde se
// va guardar ese byte. Es decir el punteo ala region del
// heap de ese tipo de dato.
:::
Stack
Stack
-------------------------
| | |
| | |
| | |
-------------------------
0xff00 0xff01 0xff02
Direcciones disminuyen <-
Region de memoria donde se van a colocar variables locales y parametros de funciones.
Nivel de funcion
Variables a nivel de funcion, o locales, se almacecnan en el Stack, dentro del marco de la funcion.
::: {#cb7 .sourceCode}
fn f(a : u8, b: u8) {
var v: u8 = 13;
}
// ------------------------------
// a: u8 | b: u8 | v: u8 |
// 1 | 2 | 12 |
// | | |
// ------------------------------
// 0xff00 0xff01 0xff02
// En el caso del stack, cuuando se hacen esta asignacion de todo
// este entorno que necesita la funcion para funcionar, se conoce en
// ingles como el function stack frame. Una vez la funcion termina
// el function stack frame se elimina o se hace un pop. En la gran
// mayoria de las arquitectura el stack crece hacia abajo o va disminuyendo.
:::