从 C++ 迁移到 Rust
问题
从 C++ 迁移到 Rust 有哪些核心差异?
答案
核心概念映射
| C++ | Rust | 说明 |
|---|---|---|
unique_ptr | Box<T> | 独占所有权 |
shared_ptr | Arc<T> | 共享所有权(线程安全) |
weak_ptr | Weak<T> | 弱引用 |
std::move | 默认行为 | Rust 所有赋值都是 move |
const& | &T | 不可变引用 |
& | &mut T | 可变引用 |
virtual | dyn Trait | 动态分发 |
template<T> | <T: Trait> | 泛型 + 约束 |
| RAII | RAII(内置) | Drop trait |
nullptr | Option::None | 编译时安全 |
try/catch | Result<T, E> | 无异常,显式错误 |
| UB 未定义行为 | 编译时禁止 | 除非 unsafe |
关键差异
1. 无隐式拷贝
// C++:隐式拷贝
std::vector<int> a = {1, 2, 3};
auto b = a; // 隐式深拷贝!
// Rust:显式
let a = vec![1, 2, 3];
let b = a; // move,a 不再可用
let c = b.clone(); // 必须显式 clone
2. 无继承,用组合 + Trait
// C++:继承
class Animal { virtual void speak() = 0; };
class Dog : public Animal { void speak() override { ... } };
// Rust:Trait + 枚举
trait Animal { fn speak(&self); }
struct Dog;
impl Animal for Dog {
fn speak(&self) { println!("Woof!"); }
}
// 或用枚举(推荐)
enum Animal { Dog, Cat }
impl Animal {
fn speak(&self) {
match self {
Animal::Dog => println!("Woof!"),
Animal::Cat => println!("Meow!"),
}
}
}
3. 线程安全
// C++:数据竞争是 UB(编译器不检查)
int counter = 0;
std::thread t1([&]{ counter++; }); // UB!
std::thread t2([&]{ counter++; }); // UB!
// Rust:编译器拒绝数据竞争
let counter = 0;
// std::thread::spawn(|| counter += 1);
// ❌ 编译错误:cannot borrow as mutable
// 必须用 Arc + Mutex
let counter = Arc::new(Mutex::new(0));
C++ 开发者常见陷阱
| 陷阱 | 说明 |
|---|---|
| "我知道这是安全的" | Rust 编译器不认为你知道,用 unsafe 标注 |
| 想用继承 | 用 Trait + 枚举 + 组合 |
| 想用指针 | 用引用 + 智能指针 |
| 想用异常 | 用 Result + ? |
常见面试问题
Q1: Rust 相比 C++ 的最大优势是什么?
答案:
编译时内存安全。C++ 的内存 bug(use-after-free、buffer overflow、data race)是运行时才暴露的 UB,可能导致安全漏洞。Rust 在编译时就消除了这些问题,同时保持了 C++ 级别的性能。
代价是更陡的学习曲线和更慢的编译速度。