跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像AI 生图工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
Rust算法

Rust 与 C/C++ 特性对比及排序算法实现

对比了 Rust 与 C/C++ 在内存管理、安全性、类型系统、并发、性能及工具链等方面的核心特性,指出 Rust 通过所有权系统和借用检查实现了编译期内存安全,而 C/C++ 依赖开发者经验。此外,文章提供了三种语言中数组排序算法的实现示例,包括标准库函数调用和手动实现的快速排序,展示了各自在语法、泛型及所有权处理上的差异,帮助开发者根据项目需求选择合适的语言或混合使用。

PentesterX发布于 2026/3/24更新于 2026/7/2023K 浏览
Rust 与 C/C++ 特性对比及排序算法实现

一、特性对比

以下是 Rust 与 C/C++ 的特性对比表,结合系统编程核心需求标注重要性(★★★★★ 为最高,★ 为最低),并附具体示例说明:

特性C/C++Rust重要性示例/说明
内存管理手动管理(malloc/free、new/delete),依赖程序员经验。易出现内存泄漏、悬垂指针、双重释放等问题。基于所有权系统自动管理,编译时强制检查内存生命周期。无垃圾回收,零成本抽象。★★★★★- C:char* buf = malloc(100); free(buf); 若重复 free(buf) 会导致未定义行为。
  • Rust:let s = String::from("hello"); 离开作用域自动释放,无手动操作。 | | 内存安全 | 无编译时保护,依赖运行时检查(如 assert)或工具(如 Valgrind)。缓冲区溢出、野指针等是常见漏洞。 | 编译时通过借用检查(Borrow Checker)和生命周期机制,禁止悬垂指针、越界访问等危险操作。 | ★★★★★ | - C:int arr[5]; arr[10] = 0; 数组越界,运行时崩溃或未定义行为。
  • Rust:let arr: [i32; 5] = [0;5]; arr[10]; 编译报错'索引超出范围'。 | | 类型系统 | 弱类型倾向(如隐式转换),模板元编程复杂但易引入未定义行为。STL 提供容器但需手动管理迭代器有效性。 | 强类型系统,泛型(Generics)+ 特征(Trait)实现零成本抽象。Option<T>/Result<T,E> 强制处理空值和错误。 | ★★★★☆ | - C++:void* ptr = new int(5); 解引用需手动转换类型,易出错。
  • Rust:fn parse_int(s: &str) -> Option<i32> 调用者必须处理 Some/None。 | | 并发安全 | 依赖手动同步(如 std::mutex),易出现数据竞争(Data Race)。线程间通信复杂,需开发者保证原子性。 | 基于所有权和生命周期的无锁并发,编译时禁止数据竞争。Send/Sync 特征标记类型是否可安全跨线程传递。 | ★★★★☆ | - C++:多线程共享 std::vector 时未加锁,可能导致迭代器失效或数据损坏。
  • Rust:let data = Arc<Mutex<Vec<i32>>>(); 自动管理锁,编译检查锁的持有。 | | 性能 | 接近硬件底层,无运行时开销(如无 GC)。适合对性能极致要求的场景(如游戏引擎、高频交易)。 | 零成本抽象(Zero-cost Abstraction),性能与 C/C++ 持平(部分场景因借用检查有微小开销,可忽略)。 | ★★★★☆ | - C++:std::vector 的随机访问 O(1),无额外开销。
  • Rust:Vec<T> 性能与 std::vector 几乎一致,编译后机器码相似。 | | 工具链与生态 | 构建工具依赖 CMake/Makefile,包管理(如 Conan)较复杂。生态成熟但历史包袱重(如旧标准库兼容性问题)。 | 内置 Cargo 包管理器(依赖解析、构建、测试一体化),生态快速增长(如 tokio 异步运行时、serde 序列化)。 | ★★★☆☆ | - C++:跨平台编译需手动配置编译器和链接器参数。
  • Rust:cargo build --target x86_64-unknown-linux-gnu 一键交叉编译。 | | 安全性(运行时) | 无内置安全机制,需依赖开发者经验或第三方库(如静态分析工具)。缓冲区溢出、整数溢出等是高危漏洞来源。 | 编译时阻止大部分内存/线程安全问题,运行时仅保留必要检查(如 panic 替代崩溃)。 | ★★★★★ | - C:strcpy(dest, src); 若 src 长度超过 dest 缓冲区,导致缓冲区溢出(常见于漏洞利用)。
  • Rust:std::string::copy_from_slice 要求目标切片长度足够,否则编译报错。 | | 学习曲线 | 语法灵活但复杂(如指针、模板元编程),新手易陷入未定义行为陷阱。 | 语法简洁但所有权/生命周期机制较难理解,需改变传统编程思维(如避免悬垂引用)。 | ★★★☆☆ | - C++:模板元编程(如 std::tuple 的类型推导)对新手不友好。
  • Rust:fn longest<'a>(x: &'a str, y: &'a str) -> &'a str 生命周期标注需理解作用域。 | | 与底层交互 | 直接操作硬件(如寄存器、内联汇编),适合开发操作系统、驱动等底层软件。 | 通过 unsafe 块允许底层操作(如指针解引用、内存分配),但强制隔离不安全代码。 | ★★★★☆ | - C:volatile uint32_t* reg = (uint32_t*)0x40000000; *reg = 0x1; 直接写入硬件寄存器。
  • Rust:unsafe { *(0x40000000 as *mut u32) = 0x1; } 需显式声明不安全。 |
  • 总结
    • C/C++ 优势在于极致性能、底层控制能力和成熟生态,适合对性能要求苛刻或需直接操作硬件的场景(如操作系统内核、游戏引擎、嵌入式开发)。
    • Rust 优势在于内存安全、并发安全和现代工具链,适合对安全性和可维护性要求高的场景(如系统级软件、网络服务、区块链底层)。

    两者并非替代关系:C/C++ 是'性能优先'的经典选择,Rust 是'安全与性能兼顾'的现代方案。实际开发中可根据场景需求(如是否需要内存安全、团队技术栈)灵活选择或混合使用(如 Rust 调用 C 库)。

    二、数组排序算法

    以下是 C、C++、Rust 三种语言中数组排序算法的示例,分别包含手动实现(演示算法逻辑)和标准库函数(实际工程推荐)两种方式,并附关键注释说明。

    一、C 语言:数组排序

    C 语言标准库提供了 qsort 函数(快速排序的变种),适合工程使用;手动实现以经典的冒泡排序和快速排序为例。

    1. 标准库函数 qsort
    #include <stdio.h>
    #include <stdlib.h>
    
    // 比较函数:用于 qsort,规定排序规则(升序)
    int compare_ints(const void *a, const void *b) {
        int arg1 = *(const int *)a;
        int arg2 = *(const int *)b;
        if (arg1 < arg2) return -1; // a < b → 升序
        if (arg1 > arg2) return 1;
        return 0;
    }
    
    int main() {
        int arr[] = {5, 2, 9, 1, 5, 6};
        int n = sizeof(arr) / sizeof(arr[0]); // 计算数组长度
    
        // 使用标准库 qsort 排序(升序)
        qsort(arr, n, sizeof(int), compare_ints);
    
        // 输出结果
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]); // 输出:1 2 5 5 6 9
        }
        return 0;
    }
    
    2. 手动实现:快速排序(递归版)
    #include <stdio.h>
    
    // 交换两个整数的值
    void swap(int *a, int *b) {
        int temp = *a;
        *a = *b;
        *b = temp;
    }
    
    // 分区函数:选择基准,将数组分为小于/大于基准的两部分
    int partition(int arr[], int low, int high) {
        int pivot = arr[high]; // 选择最后一个元素作为基准
        int i = (low - 1);     // 小于基准的元素的右边界
        for (int j = low; j <= high - 1; j++) {
            if (arr[j] <= pivot) {
                i++;
                swap(&arr[i], &arr[j]);
            }
        }
        swap(&arr[i + 1], &arr[high]); // 将基准放到正确位置
        return (i + 1);                // 返回基准的索引
    }
    
    // 快速排序递归函数
    void quick_sort(int arr[], int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high); // 分区并获取基准位置
            quick_sort(arr, low, pi - 1);       // 排序左半部分
            quick_sort(arr, pi + 1, high);      // 排序右半部分
        }
    }
    
    int main() {
        int arr[] = {5, 2, 9, 1, 5, 6};
        int n = sizeof(arr) / sizeof(arr[0]);
        quick_sort(arr, 0, n - 1); // 调用快速排序
    
        for (int i = 0; i < n; i++) {
            printf("%d ", arr[i]); // 输出:1 2 5 5 6 9
        }
        return 0;
    }
    

    二、C++:数组排序

    C++ 标准库的 std::sort 是混合排序算法(快速排序 + 堆排序 + 插入排序),效率极高;手动实现以模板化快速排序为例,展示泛型编程。

    1. 标准库函数 std::sort
    #include <iostream>
    #include <algorithm> // 包含 std::sort
    #include <vector>    // 示例用 vector(数组同理)
    
    int main() {
        int arr[] = {5, 2, 9, 1, 5, 6};
        int n = sizeof(arr) / sizeof(arr[0]);
    
        // 对原生数组排序(升序)
        std::sort(arr, arr + n); // 参数:起始指针、结束指针(左闭右开)
    
        // 对 vector 排序(效果相同)
        std::vector<int> vec = {5, 2, 9, 1, 5, 6};
        std::sort(vec.begin(), vec.end());
    
        // 输出结果
        for (int num : arr) {
            std::cout << num << " "; // 输出:1 2 5 5 6 9
        }
        return 0;
    }
    
    2. 手动实现:模板化快速排序(泛型)
    #include <iostream>
    using namespace std;
    
    // 交换模板函数(支持任意可复制类型)
    template<typename T>
    void swap(T &a, T &b) {
        T temp = a;
        a = b;
        b = temp;
    }
    
    // 分区函数(模板化)
    template<typename T>
    int partition(T arr[], int low, int high) {
        T pivot = arr[high]; // 基准元素
        int i = (low - 1);   // 小于基准的右边界
        for (int j = low; j <= high - 1; j++) {
            if (arr[j] <= pivot) {
                i++;
                swap(arr[i], arr[j]);
            }
        }
        swap(arr[i + 1], arr[high]);
        return (i + 1);
    }
    
    // 快速排序递归函数(模板化)
    template<typename T>
    void quick_sort(T arr[], int low, int high) {
        if (low < high) {
            int pi = partition(arr, low, high);
            quick_sort(arr, low, pi - 1);
            quick_sort(arr, pi + 1, high);
        }
    }
    
    int main() {
        int int_arr[] = {5, 2, 9, 1, 5, 6};
        double double_arr[] = {3.14, 1.618, 2.718, 0.5};
        int n1 = sizeof(int_arr) / sizeof(int_arr[0]);
        int n2 = sizeof(double_arr) / sizeof(double_arr[0]);
    
        quick_sort(int_arr, 0, n1 - 1);
        quick_sort(double_arr, 0, n2 - 1);
    
        cout << "Sorted int array: ";
        for (int i = 0; i < n1; i++) cout << int_arr[i] << " "; // 1 2 5 5 6 9
        cout << "\n";
        cout << "Sorted double array: ";
        for (int i = 0; i < n2; i++) cout << double_arr[i] << " "; // 0.5 1.618 2.718 3.14
        return 0;
    }
    

    三、Rust:数组排序

    Rust 标准库的 sort(稳定排序)和 sort_unstable(非稳定但更快)是高度优化的混合排序;手动实现以快速排序为例,利用 Rust 的所有权和切片特性。

    1. 标准库函数 sort 和 sort_unstable
    fn main() {
        let mut arr = [5, 2, 9, 1, 5, 6];
    
        // 稳定排序(相等元素的相对顺序不变)
        arr.sort(); // 升序
    
        // 非稳定排序(更快,适合不关心相等元素顺序的场景)
        // arr.sort_unstable();
    
        println!("{:?}", arr); // 输出:[1, 2, 5, 5, 6, 9]
    }
    
    2. 手动实现:快速排序(利用切片)
    fn quick_sort<T: Ord>(arr: &mut [T]) {
        if arr.len() <= 1 {
            return; // 空或单元素数组无需排序
        }
        let pivot_idx = partition(arr);
        let (left, right) = arr.split_at_mut(pivot_idx);
        quick_sort(left);  // 排序左半部分(不包含基准)
        quick_sort(right); // 排序右半部分(包含基准,但已处理)
    }
    
    // 分区函数(返回基准的最终位置)
    fn partition<T: Ord>(arr: &mut [T]) -> usize {
        let pivot_idx = arr.len() - 1; // 选择最后一个元素为基准
        let mut i = 0;                 // 小于基准的元素的右边界
        for j in 0..pivot_idx {
            if arr[j] <= arr[pivot_idx] {
                arr.swap(i, j); // 交换到左半部分
                i += 1;
            }
        }
        arr.swap(i, pivot_idx); // 将基准放到正确位置
        i                       // 返回基准的索引
    }
    
    fn main() {
        let mut int_arr = [5, 2, 9, 1, 5, 6];
        let mut str_arr = ["banana", "apple", "cherry", "date"];
    
        quick_sort(&mut int_arr);
        quick_sort(&mut str_arr);
    
        println!("{:?}", int_arr); // 输出:[1, 2, 5, 5, 6, 9]
        println!("{:?}", str_arr); // 输出:["apple", "banana", "cherry", "date"]
    }
    
    总结
    语言标准库排序函数手动实现核心逻辑特点
    Cqsort(快速排序变种)冒泡/快速排序(需手动管理循环和交换)需手动实现算法,灵活性高但易出错;适合学习或无标准库的嵌入式场景。
    C++std::sort(混合排序)模板化快速排序(泛型支持)标准库效率高;手动实现可利用模板实现泛型,适合理解算法和泛型编程。
    Rustsort/sort_unstable切片递归快速排序(利用所有权)标准库优化极佳;手动实现需注意切片拆分和所有权,适合学习安全并发编程。

    目录

    1. 一、特性对比
    2. 总结
    3. 二、数组排序算法
    4. 一、C 语言:数组排序
    5. 1. 标准库函数 qsort
    6. 2. 手动实现:快速排序(递归版)
    7. 二、C++:数组排序
    8. 1. 标准库函数 std::sort
    9. 2. 手动实现:模板化快速排序(泛型)
    10. 三、Rust:数组排序
    11. 1. 标准库函数 sort 和 sort_unstable
    12. 2. 手动实现:快速排序(利用切片)
    13. 总结
    • 免费图片AI生成工具免费生成了解详情
    • Magick API 一键接入全球大模型注册送1000万token查看
    • 免费图片视频在线生成30秒,将你的创意变成现实开始设计
    • X/Twitter免费视频下载器免登陆无限额度免费视频解析下载了解详情
    • 100+免费在线小游戏爽一把
    极客日志微信公众号二维码

    微信扫一扫,关注极客日志

    微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

    更多推荐文章

    查看全部
    • 飞算 JavaAI 专业版在 Java 微服务重构中的效率提升实践
    • 基于 Docker 部署 Web-Check 并通过 cpolar 实现远程访问
    • GitHub Actions 下载工件指南:download-artifact 插件使用详解
    • C++核心知识点全解析:值传递、左值右值与智能指针
    • VSCode 中 GitHub Copilot 安装与实战指南
    • Python 库 unstructured:高效转换 PDF、Word 等非结构化数据
    • OpenClaw 统一接入飞书钉钉 WhatsApp 打造 AI 指挥中心
    • 基于 FPGA 的高精度 TDC 设计
    • GitHub Copilot 代理配置与网络环境优化指南
    • 零基础学习漏洞挖掘指南与方法
    • 拆解机器人底盘 DDSM400 钕强磁外转子 65mm 伺服轮毂电机
    • 数据结构与算法:随机链表复制的三步解法
    • Rust语言入门全攻略:从选型到首个可发布CLI工具
    • Stable Diffusion 扩散模型原理及 PyTorch 工程实践
    • PLL 时钟进阶:差分与单端时钟的硬件实现及抗噪策略
    • 二分查找与二分答案详解
    • STM32单片机智能宠物喂养系统设计
    • JiaJiaOCR:纯 Java 实现的 OCR 解决方案
    • 用 AI 接管接口测试:从 OpenAPI 到 CI 流水线的一套实现
    • C++ 类和对象(二):默认成员函数深度解析

    相关免费在线工具

    • 加密/解密文本

      使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

    • Gemini 图片去水印

      基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

    • Base64 字符串编码/解码

      将字符串编码和解码为其 Base64 格式表示形式即可。 在线工具,Base64 字符串编码/解码在线工具,online

    • Base64 文件转换器

      将字符串、文件或图像转换为其 Base64 表示形式。 在线工具,Base64 文件转换器在线工具,online

    • Markdown转HTML

      将 Markdown(GFM)转为 HTML 片段,浏览器内 marked 解析;与 HTML转Markdown 互为补充。 在线工具,Markdown转HTML在线工具,online

    • HTML转Markdown

      将 HTML 片段转为 GitHub Flavored Markdown,支持标题、列表、链接、代码块与表格等;浏览器内处理,可链接预填。 在线工具,HTML转Markdown在线工具,online