- tags: Rust
 
动态大小类型(DST)和 Sized 特性
str (非 &str )就是一个 DST,我们不能在运行时得知 str 的大小。 &str 是一个指针类型,大小是已知的。
DST:拥有额外的元数据存储动态大小的信息。
每一个特性都是一个是个 DST,使用 Trait Object 必须是像 &dyn Trait 和 Box<dyn Trait> (或 Rc<dyn Trait> )的指针类型。
dyn 关键字
dyn 关键字用于将 Trait Object 指针和普通的结构体指针区分开来。
Sized vs ?Sized
Rust 有一个特定的特性叫做 Sized 去判断一个类型的大小是否是编译期可知的,并且自动在编译期为所有已知大小的类型实现,
同时 Rust 隐式的为泛型函数的类型参数加上 Sized 的限制(bound),下面这样的泛型函数:
fn generic<T>(t: T) {
	 // --snip--
}
实际上相当于像下面这样硬编码:
fn generic<T: Sized>(t: T) {
	// --snip--
}
也可以通过下面特定的语法取消这个限制:
fn geneic<T: ?Sized>(t: &T) {
	// --snip--
}