de memoria? • ¿Qué es manejo de memoria? • Estrategias de manejo de memoria Parte 3: Un ejemplo • Threads • Race conditions • Mutex • Message passing • Shared state Parte 2: Ownership en Rust • Reglas de ownership • Valores, variables y tipos • String • Referencias y borrowing • Scope • Ownership y funciones • Slices
applied to computer memory. The essential requirement of memory management is to provide ways to dynamically allocate portions of memory to programs at their request, and free it for reuse when no longer needed. This is critical to any advanced computer system where more than a single process might be underway at any time. https://en.wikipedia.org/wiki/Memory_management
a: i32; let b = "hello"; Compound let a = (true, 1, “OMG”); let b = [1, 2, 3]; Complejos let s = String::from("hello"); let mut v = Vec::new(); let mut guess = String::new(); io::stdin().read_line(&mut guess) .expect("Failed to read line");
programación, el ciclo de memoria es casi siempre parecido al siguiente: • Reservar la memoria necesaria (ej: malloc()) • Utilizarla (lectura, escritura) • Liberar la memoria una vez ya no es necesaria. (ej: free())
una variable llamada su dueño (owner) • Solo puede haber un dueño (owner) a la vez. • Cuando el dueño (owner) sale fuera de ámbito (scope), el valor será descartado (dropped).
un tipo T: • T (owned) • &mut T (exclusive) • &T (shared) fn foo(s: String) { // s es ahora dueño del string println!("{:?}", s); // acá termina el scope de s y la memoria // asignada para esta variable se libera } let a = String::from(“hello”); let b = a; // b ahora es dueño / ownership se ha movido foo(b); // ownership se ha movido a foo
un tipo T: • T (owned) • &mut T (exclusive) • &T (shared) fn foo(s: &String) { // s toma prestado el valor println!("{:?}", s); } let a = String::from(“hello”); let b = &a; // b toma prestado una referencia de solo lectura foo(b); // pasamos la referencia foo(&a); // o una nueva referencia // acá termina el scope de a y la memoria // asignada para esta variable se libera
let world = &s[6..11]; // strings literales son slices!! let s = "Hello, world!"; fn first_word(s: &str) -> &str { let bytes = s.as_bytes(); for (i, &item) in bytes.iter().enumerate() { if item == b' ' { return &s[0..i]; } } &s[..] } let my_string = String::from("hello world"); let word = first_word(&my_string[..]); let my_string_literal = "hello world"; let word = first_word(&my_string_literal[..]); let word = first_word(my_string_literal);