国产 无码 综合区,色欲AV无码国产永久播放,无码天堂亚洲国产AV,国产日韩欧美女同一区二区

Rust in Action筆記 第六章 內(nèi)存

這篇具有很好參考價(jià)值的文章主要介紹了Rust in Action筆記 第六章 內(nèi)存。希望對(duì)大家有所幫助。如果存在錯(cuò)誤或未考慮完全的地方,請(qǐng)大家不吝賜教,您也可以點(diǎn)擊"舉報(bào)違法"按鈕提交疑問。

  1. Option<T>類型在Rust中使用了空指針優(yōu)化(null pointer optimization)來保證該類型在編譯后的二進(jìn)制文件中占用0個(gè)字節(jié)。None變量是通過一個(gè)空指針null pointer來表示;
  2. 內(nèi)存地址、指針、引用的區(qū)別,內(nèi)存地址是指在內(nèi)存中的一個(gè)字節(jié),由匯編語(yǔ)言提供的一個(gè)抽象;指針,有時(shí)候也稱為裸指針(raw pointer),是指向某種數(shù)據(jù)類型的內(nèi)存地址,指針是由高級(jí)語(yǔ)言提供的抽象;引用,是一種指針,在動(dòng)態(tài)類型中,引用包含了一個(gè)指針以及一些額外的保證,引用是由Rust提供的抽象;
  3. Rust的引用提供了比指針更多的好處:引用永遠(yuǎn)指向有效的數(shù)據(jù);引用的字節(jié)排列是緊湊的,有助于CPU快速讀取;引用能夠提供變長(zhǎng)數(shù)據(jù)類型的長(zhǎng)度保證,引用的結(jié)構(gòu)中除了內(nèi)部指針本身外,還提供一個(gè)數(shù)據(jù)長(zhǎng)度的變量,確保程序永遠(yuǎn)不會(huì)跑到內(nèi)存范圍之外;
  4. {:p}可以把變量安裝指針的形式打印,打印其內(nèi)存地址;
  5. 代碼列表6.3展示了兩種從u8數(shù)組轉(zhuǎn)化成字符串的形式,b變量通過String::from_raw_parts(ptr, size, capa)首先把[u8; 10]轉(zhuǎn)化成*const u8然后轉(zhuǎn)化成*mut u8;c變量引入了CStr外部接口,通過CStr::from_ptr(c_ptr)獲取一個(gè)以\0結(jié)尾的C語(yǔ)言類型的字符串;b和c變量都需要把[u8, n]先轉(zhuǎn)換成*const u8在轉(zhuǎn)換成所需的相應(yīng)指針類型;
  6. Rust的裸指針分為*const T*mut T,分別是不可變裸指針和可變裸指針,兩者之間可以自由轉(zhuǎn)換,Rust的引用&mut T and &T編譯出來的結(jié)果就成了裸指針,也就是在實(shí)際運(yùn)行過程中不需要通過unsafe也能得到裸指針的性能;
  7. 使用裸指針的原因:不可避免的使用,當(dāng)需要系統(tǒng)調(diào)用OS功能或者某些第三方代碼需要裸指針,一般是對(duì)C寫的一些程序的外部調(diào)用;需要多個(gè)地方同時(shí)訪問數(shù)據(jù)并且對(duì)運(yùn)行時(shí)性能要求極高的時(shí)候;
  8. C++中的智能指針在Rust中對(duì)應(yīng)的是core::ptr::{Unique, Shared, Weak},胖指針(fat pointer)通常指內(nèi)存布局,對(duì)比瘦指針(thin pointer,通常也指裸指針,只有一個(gè)usize寬度),要更大一些,通常有2個(gè)usize寬度甚至更多;
  9. core::ptr::Unique是rust中String, Box<T>的構(gòu)成要素;core::ptr::SharedRc<T>, Arc<T>的構(gòu)成要素,如果要實(shí)現(xiàn)自己的智能指針,可以參考這些智能指針的實(shí)現(xiàn)細(xì)節(jié);
  10. std::rc::Weak, std::arc::Weak可用于內(nèi)部互相指向的數(shù)據(jù)結(jié)構(gòu),避免循環(huán)指針的問題;alloc::raw_vec::RawVec用于實(shí)現(xiàn)了Vec<T>, VecDeq<T>,它能夠很聰明地給任何類型的數(shù)據(jù)分配和回收內(nèi)存;std::cell::UnsafeCell用于實(shí)現(xiàn)Cell<T>, RefCell<T>,來提供內(nèi)部可變性(interior mutability);
  11. "When in doubt, prefer the stack"表示了當(dāng)不知道把數(shù)據(jù)放在堆上還是棧上時(shí),優(yōu)先放在棧上,因?yàn)闂1容^快,這句話的Rust版本是,When in doulbe, use types that implement Sized,即實(shí)現(xiàn)了Sized特征的類型會(huì)優(yōu)先放在棧上存儲(chǔ);
  12. 如何讓一個(gè)函數(shù)同時(shí)接受&str, String兩種類型的參數(shù),可以使用參數(shù)模板<T: AsRef<str>>表示參數(shù)T可以稱為str的引用,從而調(diào)用.as_ref().len()方法,詳細(xì)可見Page189;
  13. 表6.1給出了簡(jiǎn)單的棧和堆的對(duì)比,注意表中說明了在沒有Unsafe的Rust中,使用堆是安全的;
    Rust in Action筆記 第六章 內(nèi)存
  14. 幾個(gè)通用的優(yōu)化堆內(nèi)存分配的方法:提前分配好足夠的空間,將其初始化為0,到使用的時(shí)候再將其改為非0值,這種方法比較危險(xiǎn),可能會(huì)引發(fā)Rust的生命周期檢查;自己針對(duì)程序設(shè)計(jì)一個(gè)allocator,能更有效地分配出所需的空間;調(diào)研使用arena::{Arena, TypedArena},允許對(duì)象邊創(chuàng)建邊使用(created on the fly),arena是一個(gè)第三方庫(kù),鏈接;
  15. 虛擬內(nèi)存常用術(shù)語(yǔ),頁(yè)(Page)、字(Word)、頁(yè)錯(cuò)誤(Page fault)、交換(Swapping)、虛擬內(nèi)存(Virtual memory)、實(shí)際內(nèi)存(Real memory)、頁(yè)表(Page table)、段(Segment)、段錯(cuò)誤(Segmentation fault)、MMU、TLB(translation lookaside buffer),詳見Page203;
  16. 6.4.2節(jié)講了段錯(cuò)誤(segmentation fault),當(dāng)訪問一個(gè)非法區(qū)域時(shí)會(huì)產(chǎn)生,可以參考下代碼實(shí)現(xiàn);
  17. 6.4.3節(jié)講了MMU(memory mamagement unit)的作用,即把虛擬地址翻譯成物理地址,以及使用TLB緩存加速的作用, 206頁(yè)講了操作系統(tǒng)和CPU在翻譯地址過程中用到的一些小tricks;
  18. 下圖講了一個(gè)可執(zhí)行文件(ELF)是如何加載到虛擬內(nèi)存并運(yùn)行的過程Rust in Action筆記 第六章 內(nèi)存

文章來源地址http://www.zghlxwxcb.cn/news/detail-481483.html

到了這里,關(guān)于Rust in Action筆記 第六章 內(nèi)存的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!

本文來自互聯(lián)網(wǎng)用戶投稿,該文觀點(diǎn)僅代表作者本人,不代表本站立場(chǎng)。本站僅提供信息存儲(chǔ)空間服務(wù),不擁有所有權(quán),不承擔(dān)相關(guān)法律責(zé)任。如若轉(zhuǎn)載,請(qǐng)注明出處: 如若內(nèi)容造成侵權(quán)/違法違規(guī)/事實(shí)不符,請(qǐng)點(diǎn)擊違法舉報(bào)進(jìn)行投訴反饋,一經(jīng)查實(shí),立即刪除!

領(lǐng)支付寶紅包贊助服務(wù)器費(fèi)用

相關(guān)文章

  • 第六章 集合引用類型

    6.1 Object ????????到目前為止,大多數(shù)引用值的示例使用的是Object類型。Object是ECMAScript中最常用的類型之一。雖然Object的實(shí)例沒有多少功能,但很適合存儲(chǔ)和在應(yīng)用程序間交換數(shù)據(jù)。 ????????顯式地創(chuàng)建Object的實(shí)例有兩種方式。第一種是使用new操作符和Object構(gòu)造函數(shù),

    2024年01月18日
    瀏覽(18)
  • 第六章 集合引用類型(中)——定型數(shù)組

    第六章 集合引用類型(中)——定型數(shù)組

    6.3 定型數(shù)組 ????????定型數(shù)組(typed array)是ECMAScript新增的結(jié)構(gòu),目的是提升向原生庫(kù)傳輸數(shù)據(jù)的效率。實(shí)際上,JavaScript并沒有“TypedArray”類型,它所指的其實(shí)是一種特殊的包含數(shù)值類型的數(shù)組。為理解如何使用定型數(shù)組,有必要先了解一下它的用途。 6.3.1 歷史 ???

    2024年01月19日
    瀏覽(15)
  • python筆記:第六章函數(shù)&方法

    由系統(tǒng)提供,直接拿來用或是導(dǎo)入模塊后使用 函數(shù)是結(jié)構(gòu)化編程的核心 使用 def 來定義函數(shù) 為函數(shù)添加文檔字符串 如果不自定義返回值,則無返回值 return 用明確的變量組來接受函數(shù)輸出值,便于后期查看(序列解包),不用元組 標(biāo)明函數(shù)的返回值 注意:這

    2024年02月13日
    瀏覽(31)
  • 線代第六章 二次型 復(fù)習(xí)筆記

    線代第六章 二次型 復(fù)習(xí)筆記

    二次型是一個(gè)多元函數(shù) f (x1,x2,…,xn),每一項(xiàng)都是二次的,未知數(shù)的個(gè)數(shù)為任意個(gè)。 二次型可以寫成矩陣形式(三個(gè)矩陣相乘): f (x1,x2,…,xn) ? 中間的矩陣A是對(duì)稱矩陣,A稱為二次型f 的對(duì)應(yīng)矩陣。 矩陣A的秩稱為二次型的秩。r(f)=r(A) 已知二次型,怎么寫出二次型的對(duì)應(yīng)矩陣

    2024年02月13日
    瀏覽(27)
  • 計(jì)算機(jī)網(wǎng)絡(luò)-筆記-第六章-應(yīng)用層

    計(jì)算機(jī)網(wǎng)絡(luò)-筆記-第六章-應(yīng)用層

    一、第一章——計(jì)算機(jī)網(wǎng)絡(luò)概述 二、第二章——物理層 三、第三章——數(shù)據(jù)鏈路層 四、第四章——網(wǎng)絡(luò)層 五、第五章——運(yùn)輸層 六、第六章——應(yīng)用層 目錄 六、第六章——應(yīng)用層 1、應(yīng)用層概述 2、(C/S)客戶-服務(wù)器方式 (P2P)對(duì)等方式 (1)客戶-服務(wù)器方式【C/S】 (2)

    2024年02月10日
    瀏覽(19)
  • Vue筆記【動(dòng)力節(jié)點(diǎn)】第六章路由route

    Vue筆記【動(dòng)力節(jié)點(diǎn)】第六章路由route

    傳統(tǒng)web應(yīng)用 傳統(tǒng)web應(yīng)用,又叫做多頁(yè)面web應(yīng)用:核心是一個(gè)web站點(diǎn)由多個(gè)HTML頁(yè)面組成,點(diǎn)擊時(shí)完成頁(yè)面的切換,因?yàn)槭乔袚Q到新的HTML頁(yè)面上,所以當(dāng)前頁(yè)面會(huì)全部刷新。 單頁(yè)面web應(yīng)用(SPA:Single Page web Application) 整個(gè)網(wǎng)站只有一個(gè)HTM頁(yè)面,點(diǎn)擊時(shí)只是完成當(dāng)前頁(yè)面中 組件

    2024年02月01日
    瀏覽(21)
  • 《Flink學(xué)習(xí)筆記》——第六章 Flink的時(shí)間和窗口

    《Flink學(xué)習(xí)筆記》——第六章 Flink的時(shí)間和窗口

    6.1 時(shí)間語(yǔ)義 6.1.1 Flink中的時(shí)間語(yǔ)義 對(duì)于一臺(tái)機(jī)器而言,時(shí)間就是系統(tǒng)時(shí)間。但是Flink是一個(gè)分布式處理系統(tǒng),多臺(tái)機(jī)器“各自為政”,沒有統(tǒng)一的時(shí)鐘,各自有各自的系統(tǒng)時(shí)間。而對(duì)于并行的子任務(wù)來說,在不同的節(jié)點(diǎn),系統(tǒng)時(shí)間就會(huì)有所差異。 我們知道一個(gè)集群有JobMana

    2024年02月11日
    瀏覽(17)
  • 算法設(shè)計(jì)與分析復(fù)習(xí)筆記第六章分支限界法

    算法設(shè)計(jì)與分析復(fù)習(xí)筆記第六章分支限界法

    分支限界法的基本思想 分支限界法類似于回溯法,也是一種在問題的解空間樹T中搜索問題解的算法。 但在一般情況下,分枝限界法與回溯法的求解目標(biāo)不同?;厮莘ǖ那蠼饽繕?biāo)是找出解空間樹中滿足約束條件的所有解,而分枝限界法的求解目標(biāo)則是找出滿足約束條件的一個(gè)

    2024年02月03日
    瀏覽(29)
  • 《計(jì)算機(jī)網(wǎng)絡(luò):自頂向下方法》學(xué)習(xí)筆記——第六章:鏈路層

    《計(jì)算機(jī)網(wǎng)絡(luò):自頂向下方法》學(xué)習(xí)筆記——第六章:鏈路層

    兩種截然不同類型的鏈路層信道 廣播信道 :這種信道用于連接有線局域網(wǎng)、衛(wèi)星網(wǎng)和混合光纖同軸電纜接入網(wǎng)中的多臺(tái)主機(jī)。 點(diǎn)對(duì)點(diǎn)通信鏈路 :這在諸如長(zhǎng)距離鏈路連接的兩臺(tái)路由器之間,或用戶辦公室計(jì)算機(jī)與它們所連接的鄰近以太網(wǎng)交換機(jī)之間等場(chǎng)合經(jīng)常能夠發(fā)現(xiàn)。

    2024年02月03日
    瀏覽(26)
  • 動(dòng)力節(jié)點(diǎn)Redis7筆記-第六章Redis分布式系統(tǒng)

    動(dòng)力節(jié)點(diǎn)Redis7筆記-第六章Redis分布式系統(tǒng)

    Redis分布式系統(tǒng),官方稱為Redis Cluster,Redis集群,其是Redis 3.0開始推出的分布式解決方案。其可以很好地解決不同Redis節(jié)點(diǎn)存放不同數(shù)據(jù),并將用戶請(qǐng)求方便地路由到不同Redis的問題。 分布式數(shù)據(jù)庫(kù)系統(tǒng)會(huì)根據(jù)不同的數(shù)據(jù)分區(qū)算法,將數(shù)據(jù)分散存儲(chǔ)到不同的數(shù)據(jù)庫(kù)服務(wù)器節(jié)點(diǎn)上

    2024年02月07日
    瀏覽(16)

覺得文章有用就打賞一下文章作者

支付寶掃一掃打賞

博客贊助

微信掃一掃打賞

請(qǐng)作者喝杯咖啡吧~博客贊助

支付寶掃一掃領(lǐng)取紅包,優(yōu)惠每天領(lǐng)

二維碼1

領(lǐng)取紅包

二維碼2

領(lǐng)紅包