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.