直接回答:DST(Dynamically Sized Type)是编译期大小未知的类型,主要有 [T]、str 和 dyn Trait。它们不能按值存放或传参,只能放在指针后面使用;指向 DST 的指针因此是胖指针(16 字节):&[T]/&str 额外携带长度,&dyn Trait 额外携带 vtable 指针。
展开解析:泛型参数默认带 Sized 约束(fn f<T>(x: T) 实际是 T: Sized),因为按值传参要确定栈帧大小;用 T: ?Sized 可放宽,使 &str、&dyn Trait 也能代入泛型函数。切片 &[T] 只是一个借用窗口:有指针和长度,没有容量概念;Vec 转切片是廉价的 deref 操作、共享同一块内存,所以函数签名收 &[T] 比收 &Vec<T> 更通用——数组、Vec、子片段都能传。瘦指针变胖指针的过程叫 unsized coercion。
fn print_len(s: &[i32]) { println!("{}", s.len()); }
let v = vec![1, 2, 3, 4];
print_len(&v[1..3]); // 子切片共享内存,不拷贝
追问方向:为什么 Box<dyn Trait> 是 16 字节而 Box<T> 是 8 字节?哪些 std API 用了 ?Sized?自定义 DST 有什么限制?
(约 520 字)