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á"); }
-
Mencione que uma
String
é suportada por umVec
, 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}"); } }