成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Rust優于C++的兩個原因 ?

開發 前端
運行時類型信息(RTTI),RTTI意味著在運行時執行動態類型檢查和類型轉換。當啟用RTTI時,編譯器在二進制文件中包含額外的元數據以支持動態類型信息。

盡管學習曲線陡峭,Rust已經證明了自己是一門值得掌握的語言。今天,讓我們深入研究一下Rust優于C++語言的原因。

原因1:積極的編譯器優化

  • Rust的編譯器(LLVM)比C++編譯器更積極地優化代碼,這是因為所有權規則,LLVM可以做出假設。
  • LLVM在內聯函數方面更加積極,特別是對于小函數。內聯避免了函數調用開銷并使其快速。

例如,下面的函數可能會或可能不會被C++編譯器內聯,但LLVM肯定會內聯它。

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]
}

原因2:較低的運行時開銷

1,C++棧展開導致運行緩慢

什么是棧展開?

每當拋出異常時,在棧上開始分配資源和調用對象的析構函數的過程,這稱為棧展開。

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;
}

棧展開是如何工作的?

  • 調用foo()時,它獲取一個Resource對象。
  • 然后拋出std::runtime_error異常。
  • 作為結果,棧開始展開,并調用res的析構函數來釋放Resource。
  • 然后,在main()函數中捕獲異常。
  • 這確保了即使在出現異常的情況下也能正確地清理資源。

棧展開有運行時開銷,當存在深度嵌套的函數調用或具有復雜析構函數的對象時,將花費時間來釋放對象。

2,Rust使用Result和Option類型刪除了的棧展開

Rust的Result和Option類型用于錯誤處理,通過模式匹配而不是異常來處理。

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),
    }
}

3,C++運行時類型信息(RTTI)增加了二進制大小和運行時開銷

增加二進制大小:

運行時類型信息(RTTI),RTTI意味著在運行時執行動態類型檢查和類型轉換。當啟用RTTI時,編譯器在二進制文件中包含額外的元數據以支持動態類型信息。

這些元數據通常包括:類型信息表(類型描述符)、用于動態調度等的虛函數表(vtable)。這些表增加了二進制文件的大小,特別是對于具有大量多態類的程序。

增加執行時間:

動態強制轉換(dynamic_cast),這包括運行時類型檢查,以確保轉換的正確性。這種類型檢查增加了程序執行時間的開銷。

虛函數調用,C++語言中的動態多態性適用于虛函數調用,這需要在運行時查找適當的函數。與靜態調度相比,會產生額外的運行時開銷。

#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;
}

4,Rust中沒有RTTI ???

Rust的類型系統支持多態行為和動態分派(基于trait和enum),而不需要RTTI。Box啟用動態分派,不需要運行時類型信息。

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上,將高級結構轉換為高效的機器碼。

Rust優于C++的這兩個原因成立嗎???

責任編輯:武曉燕 來源: coding到燈火闌珊
相關推薦

2021-12-06 23:00:36

CC++編程語言

2024-02-26 07:26:27

RustC++開發

2011-07-21 17:11:09

AjaxJSF

2009-06-29 10:09:55

AjaxJSF

2023-03-01 10:20:13

2021-06-16 12:03:49

WindowsLinux游戲

2023-09-21 23:35:19

C++變量

2022-02-21 23:08:50

Kubernetes集群容器

2024-07-26 00:22:34

2022-10-21 18:41:23

RustC++Azure

2009-08-12 16:37:22

C#變量類型轉換

2022-03-25 09:57:18

C++Rust語言

2024-04-08 18:55:54

RustC++開發

2024-01-22 10:52:45

C++多線程死鎖

2024-06-24 07:00:00

C++RustGo

2020-09-03 07:17:28

Rus微軟C++

2010-07-02 12:26:51

LEACH協議

2009-07-15 18:29:22

Jython應用

2022-06-17 09:46:51

Chrome 102Chrome瀏覽器

2024-01-19 21:55:57

C++編程代碼
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 第一福利社区1024 | 欧美视频中文字幕 | 最新中文字幕第一页视频 | 欧美国产日韩在线观看 | 不用播放器看的av | 97久久精品午夜一区二区 | 日韩免费在线 | 91精品国产综合久久精品 | 国产高清精品一区二区三区 | 午夜男人天堂 | 久久9视频 | 96国产精品久久久久aⅴ四区 | 一区二区欧美在线 | 亚洲成人第一页 | 剑来高清在线观看 | 亚洲第一天堂无码专区 | 黄色免费在线观看 | 不卡在线视频 | 欧美在线国产精品 | 国产精品国产精品国产专区不卡 | 日韩在线播放网址 | 欧美在线一区二区三区 | 欧美性jizz18性欧美 | 99伊人网| 日韩欧美福利视频 | 亚洲网址在线观看 | 国产91在线播放 | 81精品国产乱码久久久久久 | 日韩91在线| 91佛爷在线观看 | 欧美亚洲视频 | 99视频在线免费观看 | 在线欧美亚洲 | 亚洲导航深夜福利涩涩屋 | 中文字幕一区二区三区精彩视频 | 美女日皮网站 | 在线第一页 | 欧洲色综合 | 中文字幕av第一页 | 日韩成人在线电影 | www.久草|