Rust vs C++ 深度比较

Rust由于其强大的安全性受到大量关注,被认为C++在系统编程领域最强大的挑战者。本文从语言、框架等方面比较了两者的优缺点。原文: Rust vs C++: An in-depth language comparison

alt

Rust和C++的比较是开发人员最近的热门话题,两者之间有许多相似之处,许多开发人员想知道哪一种更好(特别是对于系统编程)。

这两种语言都在系统开发领域竞争,与Python等对初学者更友好的语言相比,两者都有陡峭的学习曲线。

在选择某种编程语言时,应该考虑对于特定用例的效率和生产力。本指南将深入研究Rust和C++,比较两种语言的用途和优缺点。

概览:

  • 什么是Rust?
  • 什么是C++?
  • 技术比较
  • 框架
  • 游戏开发
  • 总结和结论
alt
什么是Rust?

Rust是Mozilla开发的一种多范式编程语言,主要关注性能和安全性,以其高级的安全并发能力而闻名,语法类似于C++,但提供了更快的速度和内存安全性(不使用垃圾收集器)。

Rust最初是为Mozilla Firefox浏览器开发的,但其效率及优势吸引了许多C++开发人员,他们开始转而使用Rust(通常用于游戏开发)。

Rust在内存管理方面独具创新。例如,不允许空指针或野指针。由于其功能,Rust通常被用于构建设备驱动程序、嵌入式系统、游戏和操作系统,如BlogOS、Redox、RustOS、Rux、Tock。

Rust代码以其在测试前调试代码的速度和能力而闻名。例如,Rust可以帮助我们开发在运行时检查代码错误的程序。

Rust的显著特征
  • 内存管理
  • 内存安全
  • 所有权系统
  • 多范式
  • 速度和性能

Rust的Hello World:

fn main() {
println!("Hello World!");
}
-->
Hello World!
alt
什么是C++?

C++是一种高级通用编译语言,已经存在了很长时间。由于其复杂的语法,C++代码通常用于需要高速、并发性的程序。C++以帮助开发者真正接近操作硬件而闻名。

C++是C语言的扩展,因此继承了许多相似之处,但更倾向于嵌入式软件和大型系统。

C++以其性能、健壮性和效率而闻名,提供了对系统及其内存的大量控制。C++是构建微软Windows等操作系统和电子游戏开发的主要语言,许多游戏开发框架都是用C++开发的。

C++还提供了丰富的标准库,称为标准模板库(Standard Template Library)。有了STL,从图形界面应用到桌面应用、3D图形和游戏,一切都很容易构建。

C++的显著特征
  • 面向对象
  • C++模板(STL)
  • 操作符重载
  • 继承
  • Lambda表达式

C++的Hello World:

#include <iostream>
using namespace std;
int main() {
  // your code goes here
  cout << "Hello World";
  return 0;
}
-->
Hello World
技术比较

那么,为什么要用Rust,或者为什么要用C++呢?如果两者都是高性能、开源、功能强大的,那么哪个是更好的选择呢?我们深入研究一下它们的技术组成部分。

从更高的角度来看,C++拥有更大的社区、更广泛的用例和更多框架,并且得到了所有软件公司的认可。另一方面,Rust在安全性、速度以及防止由于静态类型特性而导致的错误、不安全代码方面表现更好。

Rust在防止可能导致未定义行为的数据竞争方面做得很好,而C++做不到这一点,并有可能产生漏洞。

内存安全性

大多数系统级语言都不提供自动内存管理,因为垃圾收集等特性会降低性能。为了保持速度,C++牺牲了内存安全性,这是一个明显的缺点。

C++最近的更新有了一些新特性,如RAII(资源获取即初始化, Resource Acquisition is Initialization) ,以摆脱手动内存管理,但并没有解决底层的核心问题。

为了解决这一问题,Rust使用了一种所有权系统(system of ownership) ,该系统全面加强并提高了内存安全性,基本上消除了任何手动内存管理过程。Rust为内存管理过程提供了内置特性,而C++则将其留给了开发者。

指针

在计算机科学中,指针是存储内存地址的对象。换句话说,地址"指向"程序中的其他数据。智能指针是具有额外元数据和功能的数据结构。大多数高级和低级语言都有某种指针功能。

C++提供了可以像智能指针一样使用的类型std::shared_ptrstd::unique_ptr。Rust标准库中有几个智能指针,比如引用计数智能指针类型。

Rust和C++都以对象的形式大量使用智能指针(Rust中的String或C++中的std::string),并提供了许多有用的附加特性。

编译时间

C++和Rust的完整构建时间大致相同(取决于C++项目实现了多少个模板,模板越多越慢)。C++通常在增量编译方面做得更好。Rust的编译器以友好著称,提供了有用的错误消息和一流的工具。

易用性

大多数同时使用Rust和C++的人都说Rust更容易使用,因为它有定义良好的语义和防止不必要/未定义行为的能力。类似的,C++有如此多的特性,以至于要跟踪其发展很有挑战性。由于C++向开发者展示了底层工作原理,所以C程序员可以非常好的理解其功能。

框架和类库

尽管Rust比C++更年轻,但都提供了优秀的框架和库,不过C++库往往更通用一些。这里的区别在于,C++不是像Java、C#或JavaScript那样的框架驱动环境,因此这些框架并不会被广泛使用。

在Rust中,有几个提供了良好功能、安全性和健壮性代码的框架,例如:

  • Rocket: 用于提高安全性、速度和灵活性的Rust web框架。
  • Nickel: 用于开发具有明确验证规则、用户友好的信息流控制系统的Rust框架。
  • Azul: 基于Rust的即时模式GUI框架,用于开发桌面应用程序。

在库方面,C++主要是标准库[1],这是类和函数的集合,提供了几种通用容器、用于操作容器的函数、通用字符串和流(包括交互I/O和文件I/O)以及其他语言支持。

虚幻引擎是一个用C++编写游戏开发框架。

游戏开发

目前,C++是游戏开发的主要语言。大多数占据市场主导地位的游戏都是用C++编写的,而用C++编写的虚幻引擎(Unreal Engine)则是游戏开发的主要框架。

Rust也进入了游戏开发领域,但并不能提供与框架相同的功能。可以用Rust开发游戏,但要在这一领域与C++竞争还需要一些时间。随着越来越多的Rust开发者构建Rust生态系统,竞争可能会更加激烈。

所以,如果对游戏开发感兴趣,那就继续学习C++,但也要密切关注Rust,特别是现在Rust基金会创建了之后。

用户界面

尽管C++和Rust都不是UI开发的首选,不过UI开发仍然是比较两者的流行领域,他们的表现如何呢?

C++提供了GTKmm,这是GTK+ C库的现代接口。Rust提供了Azul,就是上面提到的开源即时模式GUI框架,这一框架更新更现代,拥有活跃的社区。

总结和结论

那么,哪个更好呢?两种编程语言都有各自独特的优点和缺点。

  • 就社区支持而言,C++更好。如果需要可靠的、受良好支持的、具有强大库的语言,C++是个不错的选择,游戏开发也应该使用C++。
  • Rust对于内存安全和并发性的支持更好,也更容易学习和使用。如果希望代码非常安全并避免内存泄漏,那么Rust是正确的选择。

最后,你应该选择让你觉得舒服的语言。选择Rust或C++都不会让项目失败,两种语言都是可靠的、广泛使用的、公认的语言,都可以完成工作。

你好,我是俞凡,在Motorola做过研发,现在在Mavenir做技术工作,对通信、网络、后端架构、云原生、DevOps、CICD、区块链、AI等技术始终保持着浓厚的兴趣,平时喜欢阅读、思考,相信持续学习、终身成长,欢迎一起交流学习。
微信公众号:DeepNoMind

参考资料

[1]

C++标准库: https://www.educative.io/blog/so-you-know-c-now-its-time-to-learn-the-standard-library?eid=5082902844932096

- END -

本文由 mdnice 多平台发布

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/140228.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用FastChat部署Baichuan2

1. 引言 近来&#xff0c;大型语言模型的市场需求呈现出蓬勃发展的态势。然而&#xff0c;仅仅掌握模型的数据准备和训练是不够的&#xff0c;模型的部署方法也变得至关重要。在这篇文章中&#xff0c;我们将以Baichuan2为例&#xff0c;利用FastChat进行模型部署的实战操作。…

两种常见矩形框旋转方法推导及其C++实现

在已知矩形中心点、长宽和旋转角度&#xff08;定义为矩形最长边与X轴正方向的夹角&#xff09;&#xff0c;如何确定矩形四个顶点的坐标&#xff0c;通常有以下两种处理方法。 法一&#xff1a;直接对顶点进行旋转 比如下图虚线框矩形是实线框矩形绕矩形中心点旋转后得到。在…

深度学习实战基础案例——卷积神经网络(CNN)基于Xception的猫狗识别|第2例

文章目录 一、环境准备二、数据预处理三、构建模型四、实例化模型五、训练模型5.1 构建训练函数5.2 构建测试函数5.3 开始正式训练 六、可视化精度和损失七、个体预测总结 今天使用轻量级的一个网络Xception做一个简单的猫狗识别案例&#xff0c;我的环境具体如下&#xff1a; …

记一次STM32F4 HAL IAP开发过程踩坑

第一次在HAL库上做IAP&#xff0c;不太熟悉库结构&#xff0c;被坑了一早上… MCU上做了一个shell&#xff0c;实现了goto命令跳转到APP区执行&#xff08;只是为了开发时方便&#xff09;。跳转到APP前和以前一样清理了所有初始化过的外设&#xff0c;也对中断进行了处理&…

MySQL数据库的索引和事务

目录 一、索引 1.1Mysql索引 1.2索引的作用 1.3 创建索引的依据 1.4 普通索引 修改表方式创建索引 删除索引 1.5 唯一索引 修改表方式创建 删除索引 1.6 主键索引 修改表方式创建 1.7 组合索引 1.8 全文索引 1.9查看索引 二、事务 2.1事务概念 2.2事务的ACID特…

rocketmq-spring-boot-starter 2.1.0 事务消息移除参数txProducerGroup

statrer引入 <dependency><groupId>org.apache.rocketmq</groupId><artifactId>rocketmq-spring-boot-starter</artifactId><version>2.2.3</version></dependency> starter 2.0.2对应rocketmq 4.4.0 starter 2.1.0对应rocke…

NSDT 3D孪生场景搭建:阵列摆放详解

阵列摆放概念 阵列摆放是指将物体、设备或元件按照一定的规则和间距排列组合的方式。在工程和科学领域中&#xff0c;阵列式摆放常常用于优化空间利用、提高效率或增强性能。 阵列摆放通常需要考虑间距、角度、方向、对称性等因素&#xff0c;以满足特定的要求和设计目标。不同…

Seata流程源码梳理下篇-TC

我们上篇简单梳理了下TM、RM的一些流程&#xff08;离现在过得挺久的了&#xff0c;这篇我们这篇来梳理下TC的内容。 TC (Transaction Coordinator) - 事务协调者 维护全局和分支事务的状态&#xff0c;驱动全局事务提交或回滚。 TM (Transaction Manager) - 事务管理器 定…

C++ Primer 第5章 语句

C Primer 第5章 语句 5.1 简单语句一、空语句二、别漏写分号&#xff0c;也别多写分号三、复合语句&#xff08;块&#xff09; 5.2 语句作用域5.3 条件语句5.3.1 if语句一、使用if else语句二、嵌套if语句三、注意使用花括号四、悬垂else五、使用花括号控制执行路径 5.3.2 swi…

Oracle分区的使用详解:创建、修改和删除分区,处理分区已满或不存在的插入数据,以及分区历史数据与近期数据的操作指南

一、前言 什么是表分区: Oracle的分区是一种将表或索引数据分割为更小、更易管理的部分的技术。它可以提高查询性能、简化维护操作,并提供更好的数据组织和管理。 表分区和表空间的区别和联系: 在Oracle数据库中,表空间(Tablespace)是用于存储表、索引和其他数据库对…

Baichuan2 技术报告笔记

文章目录 预训练预训练数据模型架构TokenizerPositional EmbeddingsAcitivations and NormalizationsOptimizations 对齐Supervised Fine-TuningRLHF 安全性预训练阶段对齐阶段 参考资料 对Baichuan2技术报告阅读后的笔记 Baichuan2 与其他大模型的对比如下表 预训练 预训练数…

【Java开发】Redis位图实现统计日活周活月活

最近研究了使用 Redis 的位图功能统计日活周活等数据&#xff0c;特来和大家分享下&#xff0c;Redis 位图还可用于记录用户签到情况、判断某个元素是否存在于集合中等。 1 Redis 位图介绍 Redis 位图是一种特殊的数据结构&#xff0c;它由一系列位组成&#xff0c;每个位只能…

洛谷P8815:逻辑表达式 ← CSP-J 2022 复赛第3题

【题目来源】https://www.luogu.com.cn/problem/P8815https://www.acwing.com/problem/content/4733/【题目描述】 逻辑表达式是计算机科学中的重要概念和工具&#xff0c;包含逻辑值、逻辑运算、逻辑运算优先级等内容。 在一个逻辑表达式中&#xff0c;元素的值只有两种可能&a…

Appilot发布:打造面向DevOps场景的开源AI助手

今日&#xff0c;数澈软件Seal &#xff08;以下简称“Seal”&#xff09;宣布推出面向 DevOps 场景的 AI 助手 Appilot&#xff0c;这款产品将充分利用 AI 大语言模型的能力为用户提供变革性的部署和应用管理体验。Seal 此次发布的 Appilot 项目&#xff0c;可以让用户直接输入…

leetcode 22. 括号生成

2023.9.24 看到组合两个字&#xff0c;想到了回溯。 大致思路是将所有可能的组合列出来&#xff0c;通过中止条件筛选掉无效的括号。 第一个中止条件&#xff1a;如果右括号数量大于左括号&#xff0c;那括号肯定无效。 第二个中止条件&#xff1a;当左右括号数量相等&#x…

古代有没有电子元器件?

手机&#xff0c;电脑&#xff0c;电视等等电子产品&#xff0c;无时无刻充斥在我们的生活中&#xff0c;如果有一天突然没有了这些功能多样的电子产品&#xff0c;估计大部分人都会一时之间难以适应。 这就好比正在上网&#xff0c;结果突然被人断了网&#xff0c;导致无网络连…

Go语言入门篇

目录 一、基础数据类型 1.1 变量的定义方式 1.2 用%T输出变量的类型 二、复合数据类型 2.1 数组 2.1.2、数组的遍历 2.1.3 数组传参 2.2. 切片slice 2.2.1. 初始化切片 2.2.2. append向切片中追加元素 2.2.3. 切片的截取 2.3. map 2.3.1. map初始化 2.3.2. 添加和…

操作系统权限提升(三十)之数据库提权-SQL Server sp_oacreate+sp_oamethod(dba权限)提权

SQL Server sp_oacreate+sp_oamethod(dba权限)提权 sp_oacreate+sp_oamethod介绍 在xp_cmdshell被删除或不能利用是可以考虑利用sp_oacreate,利用前提需要sqlserver sysadmin账户服务器权限为system(sqlserver2019默认被降权为mssql)。sp_oacreate 是一个存储过程,可以…

【无标题】mysql 普通用户连接报错: MySql server has gone away

1、mysql 普通用户连接报错&#xff1a; MySql server has gone away 2、进入mysql错误日志位置查看输出日志显示错误为&#xff1a; [Warning] [MY-013130] [Server] Aborted connection 47 to db: unconnected user: tjcx host: 10.195.11.4 (init_connect command failed; …

基于docker进行Grafana + prometheus实现服务监听

基于docker进行Grafana Prometheus实现服务监听 Grafana安装Prometheus安装Jvm监控配置服务器主机监控(基础cpu&#xff0c;内存&#xff0c;磁盘&#xff0c;网络) Grafana安装 docker pull grafana/grafanamkdir /server/grafanachmod 777 /server/grafanadocker run -d -p…