动态大小类型

大多数类型都具有在编译时已知固定大小,并实现了 Sized trait。大小仅在运行时才已知的类型称为动态大小类型DST),或者非正式地称为非大小类型(unsized type)。切片(Slices)trait 对象(trait objects)DST的两个例子。

这类类型只能在特定情况下使用。

  • 指向DST指针类型是大小确定的(sized),但其大小是指向大小确定类型(sized types)的指针的两倍。
    • 指向切片的指针还存储了切片的元素数量。
    • 指向 trait 对象的指针还存储了一个指向 vtable 的指针。
  • DST可以作为具有特殊 ?Sized 边界(bound)的泛型类型参数的类型实参提供。当相应的关联类型声明具有 ?Sized 边界时,它们也可以用于关联类型定义。默认情况下,任何类型参数或关联类型都具有 Sized 边界,除非使用 ?Sized 放宽了该限制。
  • Trait 可以为DST实现。与泛型类型参数不同,在 trait 定义中,Self: ?Sized 是默认设置。
  • Struct 可以包含一个DST作为最后一个字段;这使得 struct 本身成为一个DST

注意

变量(Variables)、函数参数、const 项(const items)static 项(static items)必须是 Sized 的。