什么是 Rust 中的 "fat pointer"(胖指针)以及它的用途?
大家好!我最近开始学习 Rust,遇到了 "fat pointer"(胖指针)这个术语。在官方文档和论坛上,这个词经常出现,但定义比较模糊。
我知道 Rust 中有普通指针(例如 `*const T` 或引用 `&T`),它们只是存储内存地址。但什么是“胖”指针?它与普通指针有何不同?我听说这与 trait(`dyn Trait`)和切片(`&[u8]`)有关。
例如,当我写:
```rust
let slice: &[i32] = &[1, 2, 3];
```
我知道 `slice` 是对数组的引用。但有人说这是一个 fat pointer。为什么?它不就是个引用吗?或者当我使用 trait object 时:
```rust
fn print_debug(item: &dyn Debug) {
println!("{:?}", item);
}
```
这里的 `item` 也是 fat pointer 吗?它占用多少内存?如果类型只在运行时已知,Rust 如何知道调用哪个方法?
请用通俗易懂的方式解释,最好有例子。我感觉我漏掉了什么关键内容。