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

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

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

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

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

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

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

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

  • Rust的編譯器(LLVM)比C++編譯器更積極地優(yōu)化代碼,這是因為所有權規(guī)則,LLVM可以做出假設。
  • 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)它。Hf228資訊網(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]}

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

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

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

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

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

Hf228資訊網(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;}

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Hf228資訊網(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;}

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

4,Rust中沒有RTTI ???

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

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

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

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

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

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

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 新津县| 新民市| 鹰潭市| 静安区| 类乌齐县| 永吉县| 兴安盟| 碌曲县| 扎囊县| 南川市| 诸城市| 孟村| 稻城县| 抚顺市| 潼南县| 云南省| 亳州市| 蓬溪县| 镶黄旗| 深泽县| 内乡县| 桐梓县| 赤城县| 桐城市| 射洪县| 卢氏县| 开阳县| 惠水县| 天水市| 张家口市| 新巴尔虎左旗| 门头沟区| 延庆县| 靖边县| 陆良县| 宁化县| 景洪市| 临安市| 伊宁县| 蒲江县| 武山县|