在Rust标准库中,存在很多常用的工具类特型,它们能帮助我们写出更具有Rust风格的代码。
一个Sized 类型是指 它所有的值在内存中有相同的大小,反之没有相同大小就是UnSized 类型。
Rust中几乎所有的类型都是Sized的,例如每个u64在内存中都是8个字节,每个(f32,f32,f32)元组的大小是12字节。甚至枚举也是Sized的。枚举的内存大小一般为能容纳最大字节数量变量的一个固定值。虽然Vec<T>它拥有一个分配在堆上的大小可变的缓冲区,但是Vec值本身是指向这个缓冲区的指针,同时包含了容量和长度,所以Vec<T>也是Sized 类型。
所有Sized 类型实现了 std::marker::Sized特型,这个特型为一个空特型 ,不包含任何方法或者关联类型。Rust 自动为所有能应用它的类型自动实现了它,你不能手动去实现Sized特型。Sized唯一使用的场景为类型变量约束, 一个类似T:Sized的约束需要类型T的大小在编译时是已知的。这一类的特型被称为marker特型,因为Rust语言使用它们来标记某些类型具有特定的行为。
然而,Rust也有少部分类型为unsized类型,他们的值占用的空间并不是相同的。例如,字符串切片类型str(注意,没有前面的&),是unsized。字符串文字值hello和big是对字符串切片str的引用,而这两个切片分别占用5和3字节。但是&str是固定大小的,它是个两字节的胖指针。同理数组切片类型[T]也是unsized,一个共享的[u8]的引用&[u8]可以指向任意大小的切片 。因为str和[T]类型用于声明可变大小的值,所以他们是unsized类型。
另一类常见的unsized类型为dyn类型,也就是特型对象。特型对象是一个指向实现了某个特型的值的指针。例如,类型&dyn std::io::Write和Box<dyn std::io::Write> 是指向某些实现了Write特型的引用。
这里要澄清一下,特型对象和对特型对象的引用之间的关系就和切片及切片的引用一样,有些混淆,特型对象是指dyn write, 而&dyn Write是对特型对象的引用。前者是unsized类型,因为实现Write的对象是多种多样的,大小不固定的。而后者是Sized类型,因为它其实是一个胖指针。
Rust 并不能使用变量存储unsize类型的值或者将它们作为函数参数传递。你只能通过引用来处理他们,例如&str和Box<dyn Write>,这些引用本身是sized类型。一个
Rust编程中的Sized与Unsized类型及其应用

最低0.47元/天 解锁文章
649

被折叠的 条评论
为什么被折叠?



