1 - Rust类型大小
Rust类型大小
1.1 - [Rust编程之道笔记]类型大小
Rust编程之道一书 3.2.1 节类型大小
内容出处: Rust编程之道一书,第3章类型系统,3.2.1 类型大小
3.2 类型大小
编程语言中不同的类型本质上是内存占用空间和编码方式的不同,Rust也不例外。Rust没有GC,内存首先由编译期来分配,rust代码首先由编译期来分配, Rust 代码被编译为 LLVM IR,其中携带了内存分配的信息。
因此,Rust编译器需要实现知道类型的大小,才能分配合理的内存。
可确定大小类型和动态大小类型
Rust 中绝大部分类型都是在编译期内可确定大小的类型(称为Sized Type),也有少量的动态大小的类型(Dynamic Sized Type,简写为 DST)。
对于DST,Rust提供了引用类型,因为引用总会有固定且在编译期已知的大小。如字符串切片 &str
就是一种引用类型 ,由指针和长度信息组成。
零大小类型
除了可确定大小类型和 DST 类型,Rust 还支持零大小类型(Zero Sized Type, ZST),如单元类型和单元结构体。
- 单元类型和单元结构体大小为零
- 由单元类型组成的数组大小也为零
ZST类型的特点是:值就是本身,运行时并不占用内存空间。
底类型
底类型(Bottom type)是院子类型理论的术语,其实是 never 类型,它的特点是:
- 没有值
- 是其他任意类型的子类型
如果说 ZST 类型表示“空”的话,那么底类型就是表示“无”。
Rust 中的底类型用 !
表示,也被称为 Bang Type。
Rust 中有很多中情况确实没有值,但是为了类型安全,必须归入类型系统进行统一处理,这些情况包括:
- 发散函数(Diverging Function):指会导致线程崩溃的
panic!
或者用于退出函数的std::process::exit
。 continue
和break
关键字: 只是表示流程的跳转,并不会返回什么loop
循环:虽然可以返回某个值,但是也有需要无限循环的时候- 空枚举,比如
enum Void{}
2 - Rust类型推导
Rust类型推导
2.1 - [Rust编程之道笔记]类型推导
Rust编程之道一书 3.2.2 节类型推导
内容出处: Rust编程之道一书,第3章类型系统,3.2.2 类型推导
3.2.2 类型推导
Rust 只能在局部范围内进行类型推导。
Turbofish操作符
当 Rust 无法从上下文中自动推导出类型的时候,编译期会通过错误信息提示并要求添加类型标注。
标注类型的方式:
fn main() {
let x = "1";
//标注变量的类型
let int_x : i32 = x.parse().unwrap();
//通过 Turbofish操作符 标注
assert_eq!(x.parse::<i32>().unwrap(), 1);
}
类型推导的不足
总结:rust的类型推导还不够强大, 因此,编码时推荐尽量显式声明类型,避免麻烦。