本帖最后由 bjszz 于 2026-3-8 21:11 编辑
Rust 和 C++
一、在所有权转移(std::move)
这是c++11以后的新特性,将左值强制转换为右值引用。Rust 核心规则,移动是「所有权的转移」;移动后原变量完全失效,编译器会报错。
[C++] 纯文本查看 复制代码 let p1 = String::from("我的遥控车");
let p2 = p1; // 你把遥控车给了 p2
// println!("p1 还有遥控车吗?{}", p1);
// 如果你尝试运行这行代码,Rust 编译器会直接报错!
二、不可变 / 可变变量(mut)
rust显式标记。必须使用 let mut 声明一个可变变量。c++直接声明即可修改,除非用 const 修饰。
[C++] 纯文本查看 复制代码 fn main() {
let mut mutable_binding = 1; // 声明一个可变变量
println!("修改前:{}", mutable_binding);
mutable_binding += 1; // 修改变量的值
println!("修改后:{}", mutable_binding);
// let immutable_binding = 1;
// immutable_binding += 1; // 错误:不可变变量不能被修改
}
三、不安全内存(unsafe/unsafe)
rust 用于显式开启特定操作,如解引用原始指针、调用外部函数等。它将风险隔离在代码块中,提醒审查者此处需要格外注意,c++却无对应概念
[C++] 纯文本查看 复制代码 //不安全的Rust
fn main() {
let mut num = 5;
//创建可变、不可变裸指针,可以在安全代码块创建。只是不能在不安全的代码块之外解引用裸指针
//不可变裸指针
//使用变量的地址,通过as创建裸指针
let r1 = &num as *const i32;
//可变裸指针
let r2 = &mut num as *mut i32;
//在安全代码块中,不能解引用裸指针
// println!("r1 is: {}", *r1); //error dereference of raw pointer is unsafe and requires unsafe block
// println!("r2 is: {}", *r2);
//使用unsafe块解引用裸指针
unsafe {
println!("r1 is: {}", *r1);
println!("r2 is: {}", *r2);
}
}
四、生命周期显式标记有很多不之处
rust显式标注 ('a)。当生命周期关系复杂时,需要在函数签名或结构体中用泛型生命周期参数(如 <'a>)明确标注出来。c++没有在语言层面表达引用有效期的机制
[C++] 纯文本查看 复制代码 fn longest<'a>(x: &'a str, y: &'a str) -> &'a str {
if x.len() > y.len() {
x
} else {
y
}
}
fn main() {
let x = String::from("x1");
let y = String::from("y");
let res = longest(&x, &y);
println!("{}", res);
}
把返回值改成 'static
[C++] 纯文本查看 复制代码 fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
if x.len() > y.len() {
x
} else {
y
}
}
会报错:
[C++] 纯文本查看 复制代码 error: lifetime may not live long enough
--> examples/main.rs:3:9
|
1 | fn longest<'a>(x: &'a str, y: &'a str) -> &'static str {
| -- lifetime `'a` defined here
2 | if x.len() > y.len() {
3 | x
| ^ returning this value requires that `'a` must outlive `'static`
你显式标注的生命周期是为了告诉编译器你写的这个函数要求传入或者返回的引用类型是什么样的。
大部分情况下,编译器都会理解你函数中引用的意思,所以你不需要标注了。 |