Dynamically Sized Types

动态内存宽度类型

dynamically-sized-types.md
commit: 83f725f1b9dda6166589d7b715b75b7f54143b8e
本章译文最后维护日期:2021-07-31

大多数的类型都有一个在编译时就已知的固定内存宽度,并实现了 trait Sized。只有在运行时才知道内存宽度的类型称为动态内存宽度类型(dynamically sized type)DST),或者非正式地称为非固定内存宽度类型(unsized type)。切片trait对象DSTs 的两个例子。此类类型只能在某些情况下使用:

  • 指向 DST指针类型的内存宽度是固定的(sized),但是是指向固定内存宽度类型的指针的内存宽度的两倍
    • 指向切片的指针也存储了切片的元素的数量。
    • 指向 trait对象的指针也存储了一个指向虚函数表(vtable)的指针地址
  • DST 可以作为类型实参( type arguments)来传给有 ?Sized约束的泛型参数。 当关联类型的声明有 ?size约束时,它们也可以被用于关联类型定义。 默认情况下,任何类型参数或关联类型都有 Sized约束,除非它们使用了 Sized来放宽其约束。
  • 可以为 DSTs 实现 trait。 与泛型类型参数中的默认设置不同,在 trait定义中,Self: ?Sized约束是默认情况。
  • 结构体可以包含一个 DST 作为最后一个字段;这使得该结构体也成为是一个 DST

注意变量、函数参数、常量项和静态项必须是 Sized