Sized trait的作用是什么?
编译期用它来识别在编译期确定大小的类型。Sized trait是空trait,仅仅作为标签trait供编译期使用。真正起“打标签”作用的是属性#[lang = "sized"]。该属性ang表示Sized trait供rust语言本身使用,声明为"Sized",称为语言项(Lang Item)。
Rust语言中大部分类型都是默认Sized,如果需要使用动态大小类型,则需要改为<T: ?Sized>限定。
Sized, Unsize和?Sized的关系
- Sized标记的是在编译期可确定大小的类型
- Unsized标记的是动态大小类型,在编译期无法确定其大小;目前Rust中的动态类型有trait和[T],其中[T]代表一定数量的T在内存中的一次排列,但不知道具体的数量,所以大小是末知的。
- ?Sized标记的类型包含了Sized和Unsized所标识的两种类型。所以泛型结构体,如:struct Bar<T: ?Sized>(T) 支持编译期可确定大小类型和动态大小类型两种类型。
动态大小类型的限制规则
- 只可以通过胖指针来操作Unsize类型,如&[T]或者&trait
- 变量,参数和枚举变量不能使用动态大小类型
- 结构体中只有一个字段可以使用动态大小类型,其它字段不可以使用