Qu'est-ce qu'un "fat pointer" (pointeur gras) en Rust et à quoi sert-il ?
Bonjour, collègues ! J'ai commencé à étudier Rust récemment et je suis tombé sur le terme "fat pointer" (pointeur gras). Dans la documentation officielle et sur les forums, ce mot apparaît, mais les définitions sont floues.
Je comprends qu'en Rust, il existe des pointeurs ordinaires (par exemple, `*const T` ou les références `&T`) qui stockent simplement une adresse en mémoire. Mais qu'est-ce qu'un pointeur "gras" ? En quoi diffère-t-il d'un pointeur ordinaire ? J'ai entendu dire que cela est lié aux traits (`dyn Trait`) et aux slices (`&[u8]`).
Par exemple, quand j'écris :
```rust
let slice: &[i32] = &[1, 2, 3];
```
Je sais que `slice` est une référence vers un tableau. Mais on dit que c'est un fat pointer. Pourquoi ? Pourtant, c'est juste une référence, non ? Ou quand j'utilise un trait object :
```rust
fn print_debug(item: &dyn Debug) {
println!("{:?}", item);
}
```
Ici, `item` est-il aussi un fat pointer ? Combien de mémoire occupe-t-il ? Et comment Rust sait-il quelle méthode appeler si le type n'est connu qu'à l'exécution ?
Expliquez-moi, s'il vous plaît, de manière simple, avec des exemples. J'ai l'impression d'avoir sauté une lecture.