You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.13 06:01:25