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

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

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

PentesterX发布于 2026/3/24更新于 2026/5/2923K 浏览
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. 总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

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

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

更多推荐文章

查看全部
  • Hadoop MapReduce 协同过滤推荐算法实战
  • 前端高频面试题:TypeScript 核心概念与实战解析
  • 前端开发工程师三年职业成长经历与经验总结
  • Whisper-large-v3 跨语种访谈视频自动生成双语字幕案例展示
  • C++ 多态底层实现原理详解
  • VSCode Copilot 聊天加载超时问题修复指南
  • OpenClaw 安全 AI 助理从零搭建实战
  • 使用 frontend-design Skill 提升大模型前端设计审美
  • JavaScript 能否同时胜任前后端开发
  • Android GIF 动画开源框架 android-gif-drawable 解决 OOM 问题
  • LINUX DO 社区无需邀请码注册流程说明
  • Python 结合 Neo4j 构建知识图谱入门实战
  • Microsoft Edge WebView2 Runtime 运行库快速部署与调试指南
  • 2026 年 AI 生成产品原型工具实测:墨刀、FigmaMake、Uizard 对比
  • VMware 安装 Rocky Linux 9.0 实战指南
  • Android Framework 框架层源码深度解析:启动流程与核心组件
  • node-llama-cpp 错误处理与调试:解决本地 AI 开发常见问题
  • 基于SpringBoot的高校教研室教学日历管理系统设计与实现
  • Java 基础(一):发展历程、技术体系与 JDK 环境搭建
  • 2026 年 5 月无人机新规实施:实名登记与激活双重要求详解

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如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