只有確定大小類型(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是一個零大小標記結構體,可以用於把一個包含結構體標記為含有特定屬性
