Avatar ·

O que é um "ponteiro gordo" (fat pointer) em Rust e como ele difere de um normal?

Olá, colegas! Comecei a estudar Rust e me deparei com o termo "fat pointer" (ponteiro gordo). Nos livros, escrevem que é "um ponteiro com metainformação adicional", mas não consigo entender para que serve e onde é usado. Eu sei que em Rust existem referências normais `&T`, que simplesmente apontam para dados. Mas, por exemplo, slices. Escrevi este código: ```rust fn main() { let arr = [1, 2, 3, 4, 5]; let slice: &[i32] = &arr[1..4]; println!("Comprimento do slice: {}", slice.len()); // Imprime 3 } ``` Não entendo: como o Rust sabe que o comprimento do slice é 3, se eu passo apenas uma referência para o primeiro elemento? Um ponteiro normal em C/C++ armazena apenas o endereço, e o comprimento precisa ser passado separadamente. Então, `&[i32]` não é apenas um endereço? Também ouvi falar sobre trait objects, como `Box`. Dizem que eles também são fat pointers. Mas qual é a "gordura" deles? Afinal, um `Box` normal é apenas um ponteiro para o heap. O que há de tão especial em `Box`? Expliquem, por favor.