《rust死灵书》
2025-08-01 18:13:02 1 举报
AI智能生成
rust死灵书读书笔记
作者其他创作
大纲/内容
认识安全和不安全
安全和不安全如何交互
unsafe
unsafe rust 能做些什么
使用unsafe: unsafe代码不能完全信任safe代码
Rust中的数据布局
repr(Rust)
同一种定义的两个类型,不能保证内存布局是一致的
非正常大小的类型
Dynamically Sized Types (DSTs)
零大小类型 (ZSTs)
例如没有字段的结构体、不占据任何空间
空类型
enum xxx {}
外部类型
可选的数据布局
通过repr可以选择想要的数据布局
所有权
引用
别名
即不同的指针指向相同的内存区域。
生命周期
生命周期的局限
生命周期推导
不受约束的生命周期
子类型化和变异性
丢弃检查
幽灵数据
拆分Borrows
类型转换
强转
在匹配 Trait 时,我们不进行强制转换
点运算符
会自动的解引用,来匹配指针的属性
cast
即as,必须在类型的级别上有效,否则会在编译时被静态地阻止
Transmutes
从内存的角度把一个对象转换为另一个类型的对象
未初始化内存
Checked
Rust 中的所有堆栈变量都是未初始化的,直到为它们明确赋值。与 C 不同的是,Rust 静态地阻止你读取它们,直到你为它们赋值。
丢弃标志
rust会跟踪变量、标注它是否应该被丢弃
Unchecked
rust可以使用MaybeUninit来声明未初始化的内存
基于所有权的资源管理
rust会基于所有权进行对象的构造、析构等操作。但是一些特殊的情况也会造成泄漏、例如使用了mem::forget
Unwinding
rust的错误分级:
如果某些东西可能不存在,则使用 Option
如果出了问题并且可以合理地处理,则使用 Result
如果有什么东西出错了,而且不能合理地处理,线程就会 panic
如果发生了灾难性的事情,程序就会直接中止(abort)
如果出了问题并且可以合理地处理,则使用 Result
如果有什么东西出错了,而且不能合理地处理,线程就会 panic
如果发生了灾难性的事情,程序就会直接中止(abort)
panic只是线程panic、父线程可以捕获到panic,但是不建议这样用。
异常安全
rust是非异常安全的:即发生paninc时可能使一些资源处于中间状态
Poisoning
为了避免异常时发生问题,某些类型比如Mutex会毒害自己(Poison)。比如一个拥有Mutex的线程paninc了,则其他线程也无法使用该Mutex了
并发
数据竞争
两个或多个线程同时访问一个内存位置
其中一个或多个线程是写的
其中一个或多个是非同步的
其中一个或多个线程是写的
其中一个或多个是非同步的
Send和Sync
Send表示该对象可以被发送到其他线程
Sync表示该对象可以被多个线程访问
Atomic
继承了C++20的Atomic模型
实现Vec
布局
pub struct Vec<T> {
ptr: NonNull<T>,
cap: usize,
len: usize,
_marker: PhantomData<T>,
}
ptr: NonNull<T>,
cap: usize,
len: usize,
_marker: PhantomData<T>,
}
分配内存
Push和Pop
释放内存
Deref
插入和删除
Intoiter
RawVec
Drain
把vec中元素的所有权转移出来
处理零大小的类型
最终代码
实现Arc和Mutex
实现Arc
布局
pub struct Arc<T> {
ptr: NonNull<ArcInner<T>>,
phantom: PhantomData<ArcInner<T>>,
}
pub struct ArcInner<T> {
rc: AtomicUsize,
data: T,
}
ptr: NonNull<ArcInner<T>>,
phantom: PhantomData<ArcInner<T>>,
}
pub struct ArcInner<T> {
rc: AtomicUsize,
data: T,
}
基本代码
克隆
丢弃
最终代码
外部函数接口FFI
标准库之下
0 条评论
下一页