日韩成人免费在线_国产成人一二_精品国产免费人成电影在线观..._日本一区二区三区久久久久久久久不

當(dāng)前位置:首頁 > 科技  > 軟件

Rust優(yōu)于C++的兩個原因 ?

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

盡管學(xué)習(xí)曲線陡峭,Rust已經(jīng)證明了自己是一門值得掌握的語言。今天,讓我們深入研究一下Rust優(yōu)于C++語言的原因。Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊28at.com

原因1:積極的編譯器優(yōu)化Lm328資訊網(wǎng)——每日最新資訊28at.com

  • Rust的編譯器(LLVM)比C++編譯器更積極地優(yōu)化代碼,這是因為所有權(quán)規(guī)則,LLVM可以做出假設(shè)。
  • LLVM在內(nèi)聯(lián)函數(shù)方面更加積極,特別是對于小函數(shù)。內(nèi)聯(lián)避免了函數(shù)調(diào)用開銷并使其快速。

例如,下面的函數(shù)可能會或可能不會被C++編譯器內(nèi)聯(lián),但LLVM肯定會內(nèi)聯(lián)它。Lm328資訊網(wǎng)——每日最新資訊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]}

Lm328資訊網(wǎng)——每日最新資訊28at.com

原因2:較低的運行時開銷Lm328資訊網(wǎng)——每日最新資訊28at.com

1,C++棧展開導(dǎo)致運行緩慢

什么是棧展開?Lm328資訊網(wǎng)——每日最新資訊28at.com

每當(dāng)拋出異常時,在棧上開始分配資源和調(diào)用對象的析構(gòu)函數(shù)的過程,這稱為棧展開。Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊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;}

Lm328資訊網(wǎng)——每日最新資訊28at.com

棧展開是如何工作的?Lm328資訊網(wǎng)——每日最新資訊28at.com

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

棧展開有運行時開銷,當(dāng)存在深度嵌套的函數(shù)調(diào)用或具有復(fù)雜析構(gòu)函數(shù)的對象時,將花費時間來釋放對象。Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊28at.com

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

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

Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊28at.com

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

增加二進制大小:Lm328資訊網(wǎng)——每日最新資訊28at.com

運行時類型信息(RTTI),RTTI意味著在運行時執(zhí)行動態(tài)類型檢查和類型轉(zhuǎn)換。當(dāng)啟用RTTI時,編譯器在二進制文件中包含額外的元數(shù)據(jù)以支持動態(tài)類型信息。Lm328資訊網(wǎng)——每日最新資訊28at.com

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

增加執(zhí)行時間:Lm328資訊網(wǎng)——每日最新資訊28at.com

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

虛函數(shù)調(diào)用,C++語言中的動態(tài)多態(tài)性適用于虛函數(shù)調(diào)用,這需要在運行時查找適當(dāng)?shù)暮瘮?shù)。與靜態(tài)調(diào)度相比,會產(chǎn)生額外的運行時開銷。Lm328資訊網(wǎng)——每日最新資訊28at.com

Lm328資訊網(wǎng)——每日最新資訊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;}

Lm328資訊網(wǎng)——每日最新資訊28at.com

4,Rust中沒有RTTI ???

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

Lm328資訊網(wǎng)——每日最新資訊28at.com

Rust優(yōu)于C++的這兩個原因成立嗎???Lm328資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-86213-0.htmlRust優(yōu)于C++的兩個原因 ?

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

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

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

標(biāo)簽:
  • 熱門焦點
  • 印度登月最關(guān)鍵一步!月船三號今晚進入環(huán)月軌道

    8月5日消息,據(jù)印度官方消息,月船三號將于北京時間今晚21時30分左右開始近月制動進入環(huán)月軌道。這是該探測器能夠成功的最關(guān)鍵步驟之一,如果成功將開始圍
  • 這款新興工具平臺,讓你的電腦效率翻倍

    隨著信息技術(shù)的發(fā)展,我們獲取信息的渠道越來越多,但是處理信息的效率卻成為一個瓶頸。于是各種工具應(yīng)運而生,都在爭相解決我們的工作效率問題。今天我要給大家介紹一款效率
  • 三分鐘白話RocketMQ系列—— 如何發(fā)送消息

    我們知道RocketMQ主要分為消息 生產(chǎn)、存儲(消息堆積)、消費 三大塊領(lǐng)域。那接下來,我們白話一下,RocketMQ是如何發(fā)送消息的,揭秘消息生產(chǎn)全過程。注意,如果白話中不小心提到相關(guān)代
  • 雅柏威士忌多款單品價格大跌,泥煤頂流也不香了?

    來源 | 烈酒商業(yè)觀察編 | 肖海林今年以來,威士忌市場開始出現(xiàn)了降溫跡象,越來越多不斷暴漲的網(wǎng)紅威士忌也開始悄然回歸市場理性。近日,LVMH集團旗下蘇格蘭威士忌品牌雅柏(Ardbeg
  • 共享單車的故事講到哪了?

    來源丨海克財經(jīng)與共享充電寶相差不多,共享單車已很久沒有被國內(nèi)熱點新聞關(guān)照到了。除了一再漲價和用戶直呼用不起了。近日多家媒體再發(fā)報道稱,成都、天津、鄭州等地多個共享單
  • 中國家電海外掘金正當(dāng)時|出海專題

    作者|吳南南編輯|胡展嘉運營|陳佳慧出品|零態(tài)LT(ID:LingTai_LT)2023年,出海市場戰(zhàn)況空前,中國創(chuàng)業(yè)者在海外紛紛摩拳擦掌,以期能夠把中國的商業(yè)模式、創(chuàng)業(yè)理念、戰(zhàn)略打法輸出海外,他們依
  • 華為發(fā)布HarmonyOS 4:更好玩、更流暢、更安全

    在8月4日的華為開發(fā)者大會2023(HDC.Together)大會上,HarmonyOS 4正式發(fā)布。自2019年發(fā)布以來,HarmonyOS一直以用戶為中心,經(jīng)歷四年多的發(fā)展HarmonyOS已
  • 機構(gòu)稱Q2全球智能手機出貨量同比下滑11% 蘋果份額依舊第2

    7月20日消息,據(jù)外媒報道,研究機構(gòu)的報告顯示,由于需求下滑,今年二季度全球智能手機的出貨量,同比下滑了11%,三星、蘋果等主要廠商的銷量,較去年同期均有下
  • Meta盲目擴張致超萬人被裁,重金押注元宇宙而前景未明

    圖片來源:圖蟲創(chuàng)意日前,Meta創(chuàng)始人兼CEO 馬克&middot;扎克伯發(fā)布公開信,宣布Meta計劃裁員超11000人,占其員工總數(shù)13%。他公開承認(rèn)了自己的預(yù)判失誤:&ldquo;不僅
Top 主站蜘蛛池模板: 城固县| 阿拉尔市| 新建县| 绥棱县| 松桃| 黄浦区| 新巴尔虎左旗| 广州市| 泊头市| 万州区| 桦川县| 丹凤县| 唐山市| 南昌县| 临清市| 南召县| 子长县| 玛多县| 金坛市| 南安市| 孝昌县| 云梦县| 临颍县| 万年县| 磐石市| 齐齐哈尔市| 乾安县| 花莲市| 西贡区| 宝兴县| 平顶山市| 芜湖县| 于田县| 惠来县| 青浦区| 六枝特区| 平阳县| 长葛市| 元江| 双城市| 龙海市|