Los programas asignan memoria de dos maneras:
stack: Área continua de memoria para variables locales.
Los valores tienen tamaños fijos conocidos en el momento de la compilación.
Extremadamente rápido: basta con mover un puntero de pila.
Fácil de administrar: sigue llamadas a funciones.
Gran recuerdo de la localidad.
heap: almacenamiento de valores fuera de las llamadas a funciones.
Los valores tienen tamaños dinámicos determinados en tiempo de ejecución.
Ligeramente más lento que la pila: se necesita algo de contabilidad.
No hay garantía de localidad de memoria.
Veamos un ejemplo: La creación de una cadena coloca metadatos de tamaño fijo en el stack y datos de tamaño dinámico, la cadena real, en el heap:
fn main() {
let s1 = String::from("Hello");
}