AVt天堂网 手机版,亚洲va久久久噜噜噜久久4399,天天综合亚洲色在线精品,亚洲一级Av无码毛片久久精品

當前位置:首頁 > 科技  > 軟件

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

來源: 責編: 時間:2024-04-28 17:20:44 173觀看
導讀盡管學習曲線陡峭,Rust已經證明了自己是一門值得掌握的語言。今天,讓我們深入研究一下Rust優于C++語言的原因。原因1:積極的編譯器優化Rust的編譯器(LLVM)比C++編譯器更積極地優化代碼,這是因為所有權規則,LLVM可以做出假

盡管學習曲線陡峭,Rust已經證明了自己是一門值得掌握的語言。今天,讓我們深入研究一下Rust優于C++語言的原因。cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

原因1:積極的編譯器優化cOX28資訊網——每日最新資訊28at.com

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

例如,下面的函數可能會或可能不會被C++編譯器內聯,但LLVM肯定會內聯它。cOX28資訊網——每日最新資訊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]}

cOX28資訊網——每日最新資訊28at.com

原因2:較低的運行時開銷cOX28資訊網——每日最新資訊28at.com

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

什么是棧展開?cOX28資訊網——每日最新資訊28at.com

每當拋出異常時,在棧上開始分配資源和調用對象的析構函數的過程,這稱為棧展開。cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊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;}

cOX28資訊網——每日最新資訊28at.com

棧展開是如何工作的?cOX28資訊網——每日最新資訊28at.com

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

棧展開有運行時開銷,當存在深度嵌套的函數調用或具有復雜析構函數的對象時,將花費時間來釋放對象。cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

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

Rust的Result和Option類型用于錯誤處理,通過模式匹配而不是異常來處理。cOX28資訊網——每日最新資訊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),    }}

cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

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

增加二進制大小:cOX28資訊網——每日最新資訊28at.com

運行時類型信息(RTTI),RTTI意味著在運行時執行動態類型檢查和類型轉換。當啟用RTTI時,編譯器在二進制文件中包含額外的元數據以支持動態類型信息。cOX28資訊網——每日最新資訊28at.com

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

增加執行時間:cOX28資訊網——每日最新資訊28at.com

動態強制轉換(dynamic_cast),這包括運行時類型檢查,以確保轉換的正確性。這種類型檢查增加了程序執行時間的開銷。cOX28資訊網——每日最新資訊28at.com

虛函數調用,C++語言中的動態多態性適用于虛函數調用,這需要在運行時查找適當的函數。與靜態調度相比,會產生額外的運行時開銷。cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊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;}

cOX28資訊網——每日最新資訊28at.com

4,Rust中沒有RTTI ???

Rust的類型系統支持多態行為和動態分派(基于trait和enum),而不需要RTTI。Box啟用動態分派,不需要運行時類型信息。cOX28資訊網——每日最新資訊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上,將高級結構轉換為高效的機器碼。cOX28資訊網——每日最新資訊28at.com

cOX28資訊網——每日最新資訊28at.com

Rust優于C++的這兩個原因成立嗎???cOX28資訊網——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-86213-0.htmlRust優于C++的兩個原因 ?

聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。郵件:2376512515@qq.com

上一篇: Python編程大師之路:精通Exec函數的高級技巧

下一篇: 世界上最厲害的編程神器 ,被大多數人拋棄了......

標簽:
  • 熱門焦點
  • K60至尊版剛預熱 一加Ace2 Pro正面硬剛

    Redmi這邊剛如火如荼的宣傳了K60 Ultra的各種技術和硬件配置,作為競品的一加也坐不住了。一加中國區總裁李杰發布了兩條微博,表示在自家的一加Ace2上早就已經采用了和PixelWo
  • 印度登月最關鍵一步!月船三號今晚進入環月軌道

    8月5日消息,據印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環月軌道。這是該探測器能夠成功的最關鍵步驟之一,如果成功將開始圍
  • 三言兩語說透設計模式的藝術-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創建型設計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態工廠方法模式,不屬于GoF 23種設計
  • 十個可以手動編寫的 JavaScript 數組 API

    JavaScript 中有很多API,使用得當,會很方便,省力不少。 你知道它的原理嗎? 今天這篇文章,我們將對它們進行一次小總結。現在開始吧。1.forEach()forEach()用于遍歷數組接收一參
  • 線程通訊的三種方法!通俗易懂

    線程通信是指多個線程之間通過某種機制進行協調和交互,例如,線程等待和通知機制就是線程通訊的主要手段之一。 在 Java 中,線程等待和通知的實現手段有以下幾種方式:Object 類下
  • 每天一道面試題-CPU偽共享

    前言:了不起:又到了每天一到面試題的時候了!學弟,最近學習的怎么樣啊 了不起學弟:最近學習的還不錯,每天都在學習,每天都在進步! 了不起:那你最近學習的什么呢? 了不起學弟:最近在學習C
  • 使用AIGC工具提升安全工作效率

    在日常工作中,安全人員可能會涉及各種各樣的安全任務,包括但不限于:開發某些安全工具的插件,滿足自己特定的安全需求;自定義github搜索工具,快速查找所需的安全資料、漏洞poc、exp
  • 2299元起!iQOO Pad開啟預售:性能最強天璣平板

    5月23日,iQOO如期舉行了新品發布會,除了首發安卓最強旗艦處理器的iQOO Neo8系列新機外,還在發布會上推出了旗下首款平板電腦——iQOO Pad,其搭載了天璣
  • 北京:科技教育體驗基地開始登記

      北京“科技館之城”科技教育體驗基地登記和認證工作日前啟動。首批北京科技教育體驗基地擬于2023年全國科普日期間掛牌,后續還將開展常態化登記。  北京科技教育體驗基
Top