目录
rust高级话题
前言
每一种语言都有它比较隐秘的点。rust也不例外。
零大小类型ZST
struct Foo; //类单元结构
struct Zero(
(), //单元类型
[u8;0], //0大小的数组
Foo,
);//零大小类型组成的类型
动态大小类型DST
无法静态确定大小或对齐的类型。
- 特征对象trait objects:dyn Mytrait
- 切片slices:[T]、str
特征包含vtable,通过vtable访问成员。切片是数组或Vec的一个视图。
也许你会产生好奇,为什么字符串和特征不能像一般语言设计的那样,设计成一个指针就好,而弄成一个动态大小的类型。这和普通指针有什么不同?
从程序员的角度出发,所谓动态大小类型是不存在的,因为你不能构造一个动态大小类型的对象出来,不管如何你只能构造"动态大小类型的指针"。动态大小类型更像是一个思维过程的中间产物。
注意,动态大小类型的指针和普通指针是不同的:
- 动态大小类型指针是胖指针,有地址,还有大小,也就是多维的。
如&str 可以想象成:
&str{
ptr:*u8,
size:usize,
}
既然如此,那么解引用*&str就是无意义的,因为它丢失了对象的大小。这个角度去理解动态大小类型,或者比较具体。
rust中的动态大小类型,其本质是将原本对象中的大小信息,直接放到指针里面,形成一个胖指针,而对象自身是不包含大小的。这是合理的,比如c语言中的字符串,本质就是一个