Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

动态大小类型

大多数类型具有在编译时已知的固定大小,并实现了 Sized trait。大小仅在运行时才知道的类型称为动态大小类型DST),或非正式地称为无大小类型。切片trait 对象strDST 的示例。

此类类型只能在某些情况下使用:

  • 指向 DST指针类型具有固定大小,但大小是指向有大小类型的指针的两倍,因为它们还存储元数据
    • 指向切片的指针存储元素数量;指向 str 的指针存储字节长度。
    • 指向 trait 对象的指针存储一个指向虚表的指针。
    • 指向具有无大小尾部的结构体或元组的指针存储与指向该尾部的指针相同的元数据。
  • DST 可以作为类型实参提供给具有特殊 ?Sized 约束的泛型类型参数。当对应的关联类型声明具有 ?Sized 约束时,它们也可以用于关联类型定义。默认情况下,任何类型参数或关联类型具有 Sized 约束,除非使用 ?Sized 放宽。
  • 可以为 DST 实现 trait。与泛型类型参数不同,Self: ?Sized 在 trait 定义中默认生效。
  • 结构体可以包含一个 DST 作为最后一个字段;这使得结构体本身成为 DST

Note

变量、函数参数、const 项和 static 项必须是 Sized

类型的无大小尾部是指向该类型的指针的元数据所描述的动态大小组件。切片[T])和 str 各自是自身的无大小尾部,由长度描述;trait 对象dyn Trait)是自身的无大小尾部,由指向虚表的指针描述。当结构体(根据 dynamic-sized.struct-field)或元组具有无大小的最后一个字段时,其无大小尾部是该字段的无大小尾部。有大小类型没有无大小尾部。