当前位置:首页 > 科技  > 软件

Rust优于C++的两个原因 ?

来源: 责编: 时间:2024-04-28 17:20:44 249观看
导读尽管学习曲线陡峭,Rust已经证明了自己是一门值得掌握的语言。今天,让我们深入研究一下Rust优于C++语言的原因。原因1:积极的编译器优化Rust的编译器(LLVM)比C++编译器更积极地优化代码,这是因为所有权规则,LLVM可以做出假

尽管学习曲线陡峭,Rust已经证明了自己是一门值得掌握的语言。今天,让我们深入研究一下Rust优于C++语言的原因。YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

原因1:积极的编译器优化YfP28资讯网——每日最新资讯28at.com

  • Rust的编译器(LLVM)比C++编译器更积极地优化代码,这是因为所有权规则,LLVM可以做出假设。
  • LLVM在内联函数方面更加积极,特别是对于小函数。内联避免了函数调用开销并使其快速。

例如,下面的函数可能会或可能不会被C++编译器内联,但LLVM肯定会内联它。YfP28资讯网——每日最新资讯28at.com

fn f(n: i32, dp: &mut Vec<i32>) -> i32 {    let n1 = n as usize;    if dp[n1] != -1 {        return dp[n1];    }    dp[n1] = Self::f(n-1, dp) + Self::f(n-2, dp) + Self::f(n-3, dp);    dp[n1]}

YfP28资讯网——每日最新资讯28at.com

原因2:较低的运行时开销YfP28资讯网——每日最新资讯28at.com

1,C++栈展开导致运行缓慢

什么是栈展开?YfP28资讯网——每日最新资讯28at.com

每当抛出异常时,在栈上开始分配资源和调用对象的析构函数的过程,这称为栈展开。YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

class Resource {public:    Resource() {        std::cout << "Resource acquired/n";    }    ~Resource() {        std::cout << "Resource released/n";    }};void foo() {    Resource res; // Resource acquired    throw std::runtime_error("Error in foo");}int main() {    try {        foo();    } catch (const std::runtime_error& e) {        std::cerr << "Caught exception: " << e.what() << std::endl;    }    return 0;}

YfP28资讯网——每日最新资讯28at.com

栈展开是如何工作的?YfP28资讯网——每日最新资讯28at.com

  • 调用foo()时,它获取一个Resource对象。
  • 然后抛出std::runtime_error异常。
  • 作为结果,栈开始展开,并调用res的析构函数来释放Resource。
  • 然后,在main()函数中捕获异常。
  • 这确保了即使在出现异常的情况下也能正确地清理资源。

栈展开有运行时开销,当存在深度嵌套的函数调用或具有复杂析构函数的对象时,将花费时间来释放对象。YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

2,Rust使用Result和Option类型删除了的栈展开

Rust的Result和Option类型用于错误处理,通过模式匹配而不是异常来处理。YfP28资讯网——每日最新资讯28at.com

fn divide(a: i32, b: i32) -> Result {    if b == 0 {        return Err("Division by zero");    }    Ok(a / b)}fn main() {    match divide(10, 0) {        Ok(result) => println!("Result: {}", result),        Err(e) => eprintln!("Error: {}", e),    }}

YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

3,C++运行时类型信息(RTTI)增加了二进制大小和运行时开销

增加二进制大小:YfP28资讯网——每日最新资讯28at.com

运行时类型信息(RTTI),RTTI意味着在运行时执行动态类型检查和类型转换。当启用RTTI时,编译器在二进制文件中包含额外的元数据以支持动态类型信息。YfP28资讯网——每日最新资讯28at.com

这些元数据通常包括:类型信息表(类型描述符)、用于动态调度等的虚函数表(vtable)。这些表增加了二进制文件的大小,特别是对于具有大量多态类的程序。YfP28资讯网——每日最新资讯28at.com

增加执行时间:YfP28资讯网——每日最新资讯28at.com

动态强制转换(dynamic_cast),这包括运行时类型检查,以确保转换的正确性。这种类型检查增加了程序执行时间的开销。YfP28资讯网——每日最新资讯28at.com

虚函数调用,C++语言中的动态多态性适用于虚函数调用,这需要在运行时查找适当的函数。与静态调度相比,会产生额外的运行时开销。YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

#include <iostream>#include <typeinfo>class Base {public:    virtual ~Base() {}};class Derived : public Base {};int main() {    Base* ptr = new Derived();    Derived* derived = dynamic_cast(ptr);    if (derived) {        std::cout << "Dynamic cast successful/n";    } else {        std::cout << "Dynamic cast failed/n";    }    delete ptr;    return 0;}

YfP28资讯网——每日最新资讯28at.com

4,Rust中没有RTTI ???

Rust的类型系统支持多态行为和动态分派(基于trait和enum),而不需要RTTI。Box启用动态分派,不需要运行时类型信息。YfP28资讯网——每日最新资讯28at.com

trait Printable {    fn print(&self);}struct Base;struct Derived;impl Printable for Base {    fn print(&self) {        println!("Base");    }}impl Printable for Derived {    fn print(&self) {        println!("Derived");    }}fn main() {    let base: Box = Box::new(Derived);    base.print();}

Rust的编译器建立在LLVM上,将高级结构转换为高效的机器码。YfP28资讯网——每日最新资讯28at.com

YfP28资讯网——每日最新资讯28at.com

Rust优于C++的这两个原因成立吗???YfP28资讯网——每日最新资讯28at.com

本文链接:http://www.28at.com/showinfo-26-86213-0.htmlRust优于C++的两个原因 ?

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: Python编程大师之路:精通Exec函数的高级技巧

下一篇: 世界上最厉害的编程神器 ,被大多数人抛弃了......

标签:
  • 热门焦点
  • MIX Fold3包装盒泄露 新机本月登场

    小米的全新折叠屏旗舰MIX Fold3将于本月发布,近日该机的真机包装盒在网上泄露。从图上来看,新的MIX Fold3包装盒在外观设计方面延续了之前的方案,变化不大,这也是目前小米旗舰
  • 之家push系统迭代之路

    前言在这个信息爆炸的互联网时代,能够及时准确获取信息是当今社会要解决的关键问题之一。随着之家用户体量和内容规模的不断增大,传统的靠"主动拉"获取信息的方式已不能满足用
  • 微信语音大揭秘:为什么禁止转发?

    大家好,我是你们的小米。今天,我要和大家聊一个有趣的话题:为什么微信语音不可以转发?这是一个我们经常在日常使用中遇到的问题,也是一个让很多人好奇的问题。让我们一起来揭开这
  • JavaScript学习 -AES加密算法

    引言在当今数字化时代,前端应用程序扮演着重要角色,用户的敏感数据经常在前端进行加密和解密操作。然而,这样的操作在网络传输和存储中可能会受到恶意攻击的威胁。为了确保数据
  • 冯提莫签约抖音公会 前“斗鱼一姐”消失在直播间

    来源:直播观察提起&ldquo;冯提莫&rdquo;这个名字,很多网友或许听过,但应该不记得她是哪位主播了。其实,作为曾经的&ldquo;斗鱼一姐&rdquo;,冯提莫在游戏直播的年代影响力不输于现
  • 2299元起!iQOO Pad明晚首销:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其最大的卖点
  • OPPO K11搭载长寿版100W超级闪充:26分钟充满100%

    据此前官方宣布,OPPO将于7月25日也就是今天下午14:30举办新品发布会,届时全新的OPPO K11将正式与大家见面,将主打旗舰影像,和同档位竞品相比,其最大的卖
  • Counterpoint :OPPO双旗舰战略全面落地 高端产品销量增长22%

    2023年6月30日,全球行业分析机构Counterpoint Research发布的《中国智能手机高端市场白皮书》显示,中国智能手机品牌正在寻求高质量发展,中国高端智能
  • 与兆芯合作 联想推出全新旗舰版笔记本电脑开天N7系列

    联想与兆芯合作推出全新联想旗舰版笔记本电脑开天 N7系列。这个系列采用兆芯KX-6640MA处理器平台,KX-6640MA 处理器是采用了陆家嘴架构,16nm 工艺,4 核 4 线
Top