Rust中哪些引用为胖指针?是否存在胖指针的详尽分类列表?
Rust中胖指针与瘦指针的判断方法
Rust中的所有引用都用&标注类型,无法直接从符号区分胖指针(fat)与瘦指针(thin),仅靠&符号无法得知任意引用类型的栈内存表示。例如,在了解实现细节前,难以知晓&str是胖指针而&String是瘦指针。
我的问题是:是否存在所有胖引用/指针的详尽列表,使我们可安全认定不在列表中的引用为瘦指针?(所有自定义DST需归为列表中的一个类别。)
编辑:与关联问题的区别:此处需要明确答案,能通过有限步骤判断任意类型
T对应的&T是胖指针还是瘦指针。(本问题不考虑可变性。)
判断规则(有限步骤)
- 瘦指针:当类型
T是Sized类型(编译期可确定内存大小)时,&T为瘦指针,仅存储目标内存的地址。比如&String、&i32、&Vec<i32>等指向固定大小类型的引用,都属于瘦指针。 - 胖指针:当类型
T是**DST(动态大小类型)**时,&T为胖指针,包含两个部分:目标内存地址 + 额外元数据(如长度、vtable指针等)。所有DST对应的引用均为胖指针,具体涵盖以下类别:- 切片类型:
&[T]、&str - trait对象:
&dyn Trait(存储目标地址和对应的vtable指针) - 自定义DST:例如末尾包含动态大小字段的结构体(如
struct MyDST { len: usize, data: [u8] }),其引用&MyDST属于胖指针 - 其他DST变体:比如
&dyn Fn()这类trait对象,以及动态长度数组的引用(Rust中通常以切片形式使用)
- 切片类型:
总结:只需判断T是否为DST类型,即可确定&T是胖指针还是瘦指针——所有非Sized类型(即DST)的引用都是胖指针,Sized类型的引用都是瘦指针。
内容的提问来源于stack exchange,提问作者TSK
相关产品推荐
相关产品推荐

