百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术分析 > 正文

从C++到Rust学习指南(下篇)

liebian365 2025-02-06 15:35 14 浏览 0 评论

一、Trait系统与多态(从虚函数到零成本抽象)

接口定义对比

C++虚函数与纯虚类:

// 接口定义
class Drawable {
public:
    virtual void draw() const = 0;
    virtual ~Drawable() = default;
};

// 具体实现
class Circle : public Drawable {
    void draw() const override { /*...*/ }
};

Rust的trait实现:

// Trait定义
trait Drawable {
    fn draw(&self);
}

// 结构体实现
struct Circle;
impl Drawable for Circle {
    fn draw(&self) { /*...*/ }
}

关键差异表:

特性

C++虚函数

Rust trait

动态分发

虚函数表(vtable)

dyn Trait对象

静态分发

CRTP模板模式

泛型+impl Trait

多继承

支持

通过trait组合实现

默认实现

虚函数可带实现

trait可提供默认方法

泛型约束对比

C++20概念与Rust trait约束:

// C++20概念
template
concept Drawable = requires(const T& t) {
    { t.draw() } -> std::same_as;
};

template
void render(const T& obj) { obj.draw(); }
// Rust trait约束
fn render(obj: &T) {
    obj.draw();
}

// 或使用where从句
fn render(obj: &T)
where
    T: Drawable + Clone
{ /*...*/ }

二、智能指针深度解析(从C++指针到Rust安全包装)

常见智能指针对比

C++类型

Rust对应

特性说明

unique_ptr

Box

独占所有权,堆分配

shared_ptr

Rc/Arc

引用计数(单线程/多线程)

weak_ptr

Weak

非拥有观察指针

scoped_ptr

无(默认移动语义)

Rust所有权系统自动处理

reference_wrapper

RefCell

内部可变性模式

内部可变性模式

C++的mutable陷阱:

class Cache {
    mutable std::mutex mtx;  // 逻辑const但物理可变
    mutable int access_count = 0;

public:
    int get(int key) const {
        std::lock_guard lock(mtx);  // const方法修改mutex
        ++access_count;             // 修改成员变量
        // ...
    }
};

Rust的安全实现:

struct Cache {
    data: RwLock>,
    access_count: AtomicUsize,  // 原子操作
}

impl Cache {
    fn get(&self, key: i32) -> Option {
        let _guard = self.data.read().unwrap();
        self.access_count.fetch_add(1, Ordering::Relaxed);
        // ...
    }
}

三、并发编程模型(从线程安全到无畏并发)

线程创建对比

C++标准线程:

std::vector threads;
for (int i=0; i<5; ++i) {
    threads.emplace_back([i] {
        std::cout << "Thread " << i << std::endl;
    });
}
for (auto& t : threads) t.join();

Rust的移动语义保证:

let handles: Vec<_> = (0..5).map(|i| {
    thread::spawn(move || {  // 显式转移所有权
        println!("Thread {}", i);
    })
}).collect();

for handle in handles {
    handle.join().unwrap();
}

同步原语对比

C++类型

Rust对应

安全增强特性

std::mutex

Mutex

关联数据保护(lock().data)

std::atomic

AtomicXXX

内存顺序显式指定

std::condition_variable

Condvar

必须配合Mutex使用

std::shared_mutex

RwLock

读写锁自动管理

安全访问示例:

let counter = Arc::new(Mutex::new(0));
let mut handles = vec![];

for _ in 0..10 {
    let counter = Arc::clone(&counter);
    handles.push(thread::spawn(move || {
        let mut num = counter.lock().unwrap();
        *num += 1;
    }));
}

四、Unsafe与FFI(与C/C++的互操作)

不安全代码对比

C++默认不安全:

// 合法的危险代码
int* ptr = (int*)0x1234;
*ptr = 42;  // 未定义行为

Rust的安全边界:

unsafe {
    let ptr = 0x1234 as *mut i32;
    *ptr = 42;  // 必须在unsafe块中
}

C++互操作示例

Rust调用C++函数:

// 声明外部函数
#[link(name = "cpplib")]
extern "C" {
    fn cpp_add(a: i32, b: i32) -> i32;
}

// 安全包装
pub fn safe_add(a: i32, b: i32) -> Result {
    unsafe { Ok(cpp_add(a, b)) }
}

C++调用Rust函数:

// Rust侧
#[no_mangle]
pub extern "C" fn rust_multiply(a: i32, b: i32) -> i32 {
    a * b
}

// C++侧
extern "C" {
    int rust_multiply(int a, int b);
}

int main() {
    std::cout << rust_multiply(3, 4);  // 输出12
}

五、元编程与高级特性

宏系统对比

C++模板元编程:

template
constexpr auto type_name() {
    return std::string_view(__PRETTY_FUNCTION__)
        .substr(32, sizeof(__PRETTY_FUNCTION__)-34);
}

Rust声明宏:

macro_rules! vec {
    ($($x:expr),*) => {
        {
            let mut temp_vec = Vec::new();
            $(temp_vec.push($x);)*
            temp_vec
        }
    };
}

let v = vec![1, 2, 3];  // 使用宏

泛型实现机制

C++模板实例化:

template
struct Wrapper { T value; };

// 编译生成具体类型
Wrapper w1;
Wrapper w2;

Rust的Monomorphization:

struct Wrapper { value: T }

// 编译时生成具体实现
let w1: Wrapper = ...;
let w2: Wrapper = ...;

六、工程实践与生态工具

项目管理对比

C++工具链

Rust对应

功能增强

CMake

Cargo.toml

声明式依赖管理

Conan/vcpkg

crates.io

官方中央仓库

GoogleTest

cargo-test

内置测试框架

Clang-Format

rustfmt

官方代码格式化

Valgrind

MIRI

常量求值检测器

现代特性支持

// 异步编程(对比C++协程)
async fn fetch_data(url: &str) -> Result {
    reqwest::get(url).await?.text().await
}

// 模式匹配增强
match value {
    1..=5 => println!("1-5"),
    Some(x) if x > 10 => println!(">10"),
    _ => println!("other"),
}

七、从C++到Rust的思维转变

哲学差异总结

维度

C++哲学

Rust哲学

安全优先

信任程序员

默认安全

抽象成本

零成本抽象

零成本抽象+安全保证

错误处理

异常/错误码

显式Result/Option

并发模型

自由但危险

类型系统保证安全

元编程

模板元编程

Trait+宏系统

学习路径建议

  1. 从所有权系统入手,理解移动语义
  2. 掌握Result/Option的错误处理范式
  3. 深入trait系统实现多态
  4. 学习借用检查器的"思维语言"
  5. 用cargo管理项目,拥抱现代工具链
  6. 在unsafe代码中寻找安全边界
// Rust的终极哲学体现在这里
fn main() {
    let mut journey = LearningJourney::new();
    loop {
        match journey.step() {
            Ok(knowledge) => knowledge.apply(),
            Err(e) => eprintln!("Error: {}", e),
        }
    }
}

通过本系列三篇指南,C++程序员可以建立起从C++到Rust的认知桥梁。Rust不是要取代C++,而是在系统编程领域提供了一个更安全的现代化选择。掌握这两种语言将使您成为更全面的系统级开发者,既能处理遗留代码,又能编写安全高效的新时代软件。

相关推荐

4万多吨豪华游轮遇险 竟是因为这个原因……

(观察者网讯)4.7万吨豪华游轮搁浅,竟是因为油量太低?据观察者网此前报道,挪威游轮“维京天空”号上周六(23日)在挪威近海发生引擎故障搁浅。船上载有1300多人,其中28人受伤住院。经过数天的调...

“菜鸟黑客”必用兵器之“渗透测试篇二”

"菜鸟黑客"必用兵器之"渗透测试篇二"上篇文章主要针对伙伴们对"渗透测试"应该如何学习?"渗透测试"的基本流程?本篇文章继续上次的分享,接着介绍一下黑客们常用的渗透测试工具有哪些?以及用实验环境让大家...

科幻春晚丨《震动羽翼说“Hello”》两万年星间飞行,探测器对地球的最终告白

作者|藤井太洋译者|祝力新【编者按】2021年科幻春晚的最后一篇小说,来自大家喜爱的日本科幻作家藤井太洋。小说将视角放在一颗太空探测器上,延续了他一贯的浪漫风格。...

麦子陪你做作业(二):KEGG通路数据库的正确打开姿势

作者:麦子KEGG是通路数据库中最庞大的,涵盖基因组网络信息,主要注释基因的功能和调控关系。当我们选到了合适的候选分子,单变量研究也已做完,接着研究机制的时便可使用到它。你需要了解你的分子目前已有哪些...

知存科技王绍迪:突破存储墙瓶颈,详解存算一体架构优势

智东西(公众号:zhidxcom)编辑|韦世玮智东西6月5日消息,近日,在落幕不久的GTIC2021嵌入式AI创新峰会上,知存科技CEO王绍迪博士以《存算一体AI芯片:AIoT设备的算力新选择》...

每日新闻播报(September 14)_每日新闻播报英文

AnOscarstatuestandscoveredwithplasticduringpreparationsleadinguptothe87thAcademyAward...

香港新巴城巴开放实时到站数据 供科技界研发使用

中新网3月22日电据香港《明报》报道,香港特区政府致力推动智慧城市,鼓励公私营机构开放数据,以便科技界研发使用。香港运输署21日与新巴及城巴(两巴)公司签署谅解备忘录,两巴将于2019年第3季度,开...

5款不容错过的APP: Red Bull Alert,Flipagram,WifiMapper

本周有不少非常出色的app推出,鸵鸟电台做了一个小合集。亮相本周榜单的有WifiMapper's安卓版的app,其中包含了RedBull的一款新型闹钟,还有一款可爱的怪物主题益智游戏。一起来看看我...

Qt动画效果展示_qt显示图片

今天在这篇博文中,主要实践Qt动画,做一个实例来讲解Qt动画使用,其界面如下图所示(由于没有录制为gif动画图片,所以请各位下载查看效果):该程序使用应用程序单窗口,主窗口继承于QMainWindow...

如何从0到1设计实现一门自己的脚本语言

作者:dong...

三年级语文上册 仿写句子 需要的直接下载打印吧

描写秋天的好句好段1.秋天来了,山野变成了美丽的图画。苹果露出红红的脸庞,梨树挂起金黄的灯笼,高粱举起了燃烧的火把。大雁在天空一会儿写“人”字,一会儿写“一”字。2.花园里,菊花争奇斗艳,红的似火,粉...

C++|那些一看就很简洁、优雅、经典的小代码段

目录0等概率随机洗牌:1大小写转换2字符串复制...

二年级上册语文必考句子仿写,家长打印,孩子照着练

二年级上册语文必考句子仿写,家长打印,孩子照着练。具体如下:...

一年级语文上 句子专项练习(可打印)

...

亲自上阵!C++ 大佬深度“剧透”:C++26 将如何在代码生成上对抗 Rust?

...

取消回复欢迎 发表评论: