Rust中的类型大小总结


  • 只有确定大小类型(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是一个零大小标记结构体,可以用于把一个包含结构体标记为含有特定属性


  • 免责声明!

    本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



     
    粤ICP备18138465号  © 2018-2025 CODEPRJ.COM