跳到主要内容

从 C++ 迁移到 Rust

问题

从 C++ 迁移到 Rust 有哪些核心差异?

答案

核心概念映射

C++Rust说明
unique_ptrBox<T>独占所有权
shared_ptrArc<T>共享所有权(线程安全)
weak_ptrWeak<T>弱引用
std::move默认行为Rust 所有赋值都是 move
const&&T不可变引用
&&mut T可变引用
virtualdyn Trait动态分发
template<T><T: Trait>泛型 + 约束
RAIIRAII(内置)Drop trait
nullptrOption::None编译时安全
try/catchResult<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++ 级别的性能。

代价是更陡的学习曲线和更慢的编译速度。

相关链接