zoukankan      html  css  js  c++  java
  • 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是一个零大小标记结构体,可以用于把一个包含结构体标记为含有特定属性

  • 相关阅读:
    Lua 语言环境安装
    python __init__.py 的作用
    python functiontools模块中的 wraps
    函数装饰器、类装饰器
    redis pipline 和 事务
    Innodb中的行锁与表锁
    mongoengine 分页 切片与 skip + limit 的区别
    python 可变类型传的内存地址, 不可变类型在传递的时候传的是值
    PHP常用人工智能库
    PHP批量给目录下所有的文件转换编码
  • 原文地址:https://www.cnblogs.com/kundij/p/14710426.html
Copyright © 2011-2022 走看看