• 只有确定大小类型(sized type)的实例才可以放到栈上,也就是,可以通过传值的方式传递

  • 不确定大小类型(unsized tpe)的实例不能放到栈上而且必须通过传引用的方式传递

  • 指向不确定大小类型(unsized tpe)的指针是双宽度的,因为除了保存指向数据的指针外,还需要额外的比特位来追踪数据的长度或者指向一个vtable

  • Sized是一个"自动(auto)"标记trait

  • 所有的泛型类型参数默认是被Sized自动约束

  • 如果我们有一个泛型函数,它接收隐于指针后的类型T为参数,例如&TBox<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是一个零大小标记结构体,可以用于把一个包含结构体标记为含有特定属性

 posted on 2021-04-27 18:54  kundij  阅读(668)  评论(0编辑  收藏  举报