Exemplo de Pilha e Heap

A criação de uma String coloca metadados de tamanho fixo na pilha e dados dinamicamente dimensionados - a string propriamente dita - no heap:

fn main() {
    let s1 = String::from("Olá");
}
StackHeaps1ptrHellolen5capacity5
  • Mencione que uma String é suportada por um Vec, portanto ela tem um tamanho e capacidade e pode crescer se for mutável por meio de realocação no heap.

  • Se os alunos perguntarem sobre isso, você pode mencionar que a memória subjacente é alocada no heap usando o System Allocator e os alocadores personalizados podem ser implementados usando a API Allocator.

  • Podemos inspecionar o layout da memória com código inseguro (unsafe). No entanto, você deve apontar que isso é legitimamente inseguro!

    fn main() {
        let mut s1 = String::from("Olá");
        s1.push(' ');
        s1.push_str("mundo");
        // DON'T DO THIS AT HOME! For educational purposes only.
        // String provides no guarantees about its layout, so this could lead to
        // undefined behavior.
        unsafe {
            let (ptr, capacity, len): (usize, usize, usize) = std::mem::transmute(s1);
            println!("Ponteiro = {ptr:#x}, tamanho = {len}, capacidade = {capacity}");
        }
    }