在Rust中一个类型实现了Size trait 则表明该类型在编译时能确定大小。Rust的基本类型基本都实现了Size trait。如果一个类型没有实现该trait,则不能用于定义变量和作为参数传递。那在Rust中哪些类型没有实现Size trait 呢?str, [T], trait 都没有实现该trait。通过引用和trait object 可以包装成有大小的类型。看一张图:

下面说说?Sized是个什么东西?在泛型编程时,经常遇到这个trait。该trait用于修饰一个类型,表明该类型的大小在编译时可以是未知的。下面看一个例子:
struct Any<T: ?Sized> {
v: Box<T>
}
impl<T: ?Sized> Any<T> {}
fn main() {
let _a = Any {
v: Box::new(1),
};
}