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