-
只有确定大小类型(sized type)的实例才可以放到栈上,也就是,可以通过传值的方式传递
-
不确定大小类型(unsized tpe)的实例不能放到栈上而且必须通过传引用的方式传递
-
指向不确定大小类型(unsized tpe)的指针是双宽度的,因为除了保存指向数据的指针外,还需要额外的比特位来追踪数据的长度或者指向一个vtable
-
Sized
是一个"自动(auto)"标记trait -
所有的泛型类型参数默认是被
Sized
自动约束 -
如果我们有一个泛型函数,它接收隐于指针后的类型
T
为参数,例如&T
,Box<T>
,Rc<T>
等,那么我们总是选择退出默认的Sized
约束而选用T:?Sized
约束 -
利用切片和Rust的自动类型强制转换能够让我们写出灵活的API
-
所有的trait默认都是
?Sized
-
对于
impl Trait for dyn Trait
,要求Trait: ?Sized
-
我们可以在每个方法上要求
Self:Sized
-
由
Sized
约束的trait不能转为trait对象 -
Rust不支持超过2个宽度的指针,因此
- 我们不能把不确定大小类型转为trait对象
- 我们不能有多trait对象,但是我们可以通过把多个trait合并到一个trait里来解决这个问题
-
用户定义的不确定类型大小类型是个不成熟的特性,现在其局限性超过所能带来的益处
-
ZST的所有实例都相等
-
Rust编译器会去优化和ZST相关的交互
-
!
可以被强制转换为其他类型 -
无法创建一个
!
的实例,我们可以利用这一点在类型级别把特定状态标记为不可能 -
PhantomData
是一个零大小标记结构体,可以用于把一个包含结构体标记为含有特定属性