02-动态大小类型
动态大小类型 — The Rust Reference
2 分钟阅读
译文 · 基于 The Rust Reference
原文链接: https://doc.rust-lang.org/reference/dynamically-sized-types.html
r[dynamic-sized]
动态大小类型
r[dynamic-sized.intro]
大多数类型具有在编译时已知的固定大小,并实现 trait Sized。大小仅在运行时才知道的类型称为 动态大小类型(DST),非正式地也称为不定大小类型。切片、trait 对象和 str 都是 DST 的例子。
r[dynamic-sized.restriction] 此类类型只能在某些情况下使用:
r[dynamic-sized.pointer-types]
- 指向 DST 的指针类型是有大小的,但其大小是指向有大小类型的指针的两倍,因为它们还存储 元数据:
- 指向切片的指针存储元素个数;指向
str的指针存储以字节计的长度。 - 指向 trait 对象的指针存储指向 vtable 的指针。
- 指向带有不定大小尾部的结构体或元组的指针,存储与指向该尾部的指针相同的元数据。
- 指向切片的指针存储元素个数;指向
r[dynamic-sized.question-sized]
- DST 可以作为类型实参提供给具有特殊
?Sized约束的泛型类型参数。当相应的关联类型声明具有?Sized约束时,它们也可以用于关联类型定义。默认情况下,任何类型参数或关联类型都具有Sized约束,除非使用?Sized将其放宽。
r[dynamic-sized.trait-impl]
- Trait 可以为 DST 实现。与泛型类型参数不同,在 trait 定义中,
Self: ?Sized是默认情况。
r[dynamic-sized.struct-field]
- 结构体可以将 DST 作为最后一个字段;这会使该结构体自身也成为 DST。
r[dynamic-sized.tail]
一个类型的 不定大小尾部 是指向该类型的指针的元数据所描述的动态大小组成部分。切片([T])和 str 各自是自己的不定大小尾部,由长度描述;trait 对象(dyn Trait)是自己的不定大小尾部,由指向 vtable 的指针描述。当结构体(见 [dynamic-sized.struct-field])或元组的最后一个字段不定大小时,其不定大小尾部就是该字段的不定大小尾部。有大小的类型没有不定大小尾部。