Rust常用特型之Sized特型

Rust编程中的Sized与Unsized类型及其应用

在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。字符串文字值hellobig是对字符串切片str的引用,而这两个切片分别占用5和3字节。但是&str是固定大小的,它是个两字节的胖指针。同理数组切片类型[T]也是unsized,一个共享的[u8]的引用&[u8]可以指向任意大小的切片 。因为str[T]类型用于声明可变大小的值,所以他们是unsized类型。

另一类常见的unsized类型为dyn类型,也就是特型对象。特型对象是一个指向实现了某个特型的值的指针。例如,类型&dyn std::io::WriteBox<dyn std::io::Write> 是指向某些实现了Write特型的引用。

这里要澄清一下,特型对象和对特型对象的引用之间的关系就和切片及切片的引用一样,有些混淆,特型对象是指dyn write, 而&dyn Write是对特型对象的引用。前者是unsized类型,因为实现Write的对象是多种多样的,大小不固定的。而后者是Sized类型,因为它其实是一个胖指针。

Rust 并不能使用变量存储unsize类型的值或者将它们作为函数参数传递。你只能通过引用来处理他们,例如&strBox<dyn Write>,这些引用本身是sized类型。一个

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AiMateZero

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值