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