1. 引言与动机 🟢
课程方法
本课程旨在提升互动性与实践性。我们假设你已经熟悉 C、C++ 或两者,我们的目标是将这些熟悉的 C/C++ 概念映射到 Rust 等效项中。
- 高互动性:欢迎在课程进行中随时提问。
- 关联性:我们使用 C/C++ 类比方式来解释 Rust 的独特功能。
- 动手实践:每章末尾都配有练习以建立肌肉记忆。
为什么选择 Rust
对于 C 和 C++ 开发者而言,采用 Rust 的主要动力在于 在不牺牲性能的前提下保障安全性。
- 超过 70% 的漏洞 (CVE) 都是由内存安全问题引起的(缓冲区溢出、释放后使用等)。
- 尽管现代 C++(智能指针、RAII)提高了安全性,但它仍然只是 “最外层” 的改进,并未消除语言底层的根本风险。
- Rust 提供了与 C/C++ 相同的底层控制力,但将安全检查从 运行时迁移到了编译器阶段。
Rust 如何解决 C/C++ 的痛点
1. 缓冲区溢出
Rust 的字符串和数组都会进行边界检查。任何越界访问都会导致可预测的 panic(运行时崩溃),而永远不会产生未定义行为 (UB)。
2. 悬垂指针
Rust 的 所有权与借用检查器 (Borrow Checker) 确保引用永远不会比它所指向的数据活得更久,从而在编译阶段消除了“释放后使用”和悬垂指针。
3. 数据竞争
通过 Send 和 Sync Trait,编译器可以保证线程安全,从而使数据竞争在 Safe Rust 中完全不可能发生。
4. 内存泄漏与资源管理
Rust 的 Drop Trait 实现比 C++ 更严格的 RAII。它与所有权系统相结合,不仅防止了资源泄漏,还避开了复杂的“五项法则 (Rule of Five)”。
Rust 与 C/C++ 快速对比
| 功能 | C / C++ | Rust |
|---|---|---|
| 内存 | 手动或智能指针 | 所有权与借用 |
| 安全 | 开发者职责 | 编译器保证 |
| 错误处理 | 错误码或异常 | Result<T, E> / Option<T> |
| 线程 | 手动同步 | 安全并发 (Send/Sync) |
| 构建系统 | Make / CMake | Cargo (集成化) |