Tiempos de memoria

Entonces, como ya hemos visto, los datos que usará nuestro programa escrito en Zig, necesitan tener definido un tipo y tamaño. Zig necesita conocer eso. Pero hay otra cosa que también puede llegar a saber sobre esos datos: su contenido.

Si Zig conoce también el contenido de un dato, quiere decir que es un dato conocido en tiempo de compilación.  

En cambio, si el contenido no se puede conocer desde el inicio del programa, entonces son datos conocidos sólo en tiempo de ejecución.

Tanto la stack como heap son parte de la memoria de tiempo de ejecución, y estos conceptos “temporales” nos ayudan a entender cómo y cuándo se usa cada zona:

Cuando, por ejemplo, definimos una cadena así:

      const s_hello: []const u8 = "Hola a todos";

Hemos definido el tipo ([]const u8), y Zig puede adivinar el tamaño gracias al literal asignado, y además conoce exactamente el contenido. Es claramente un dato de tiempo de compilación.

Pero si definimos y después cambiamos un número así:

      var n_x: u8 = 41;

  n_x += 1;

La variable n_x ha sido modificada por una instrucción. Y en este caso, esa instrucción, a pesar de ser una operación sencillísima, basta para que n_x sea un dato conocido sólo cuando se ejecute el programa, por lo tanto es un dato de tiempo de ejecución.

Todo esto, en realidad, no importa gran cosa en un caso tan sencillo como un simple incremento de variable. Donde sí empieza a importar es cuando utilizamos funciones para procesar datos, y en especial cuánto más complejo sea el tipo de dato, más atención hay que ponerle en cómo gestionamos la memoria.

Y esa es una de las bases del Zig:

        En Zig tenemos el control pleno y explícito sobre cómo se gestiona la memoria. Eso sí - ese control implica una gran responsabilidad: saber cómo hacerlo. Y en un principio no es tan complicado si entendemos unas pautas clave.


Dónde están los bytes
Punteros
© 2025 Zen of Zig