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

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

一篇學(xué)會 Rust 內(nèi)存布局

來源: 責(zé)編: 時間:2023-11-28 09:33:05 257觀看
導(dǎo)讀圖片題圖忘了來自哪里..整型,浮點型,struct,vec!,enum本文是對 Rust內(nèi)存布局[1] 的學(xué)習(xí)與記錄struct A { a: i64, b: u64,}struct B { a: i32, b: u64,}struct C { a: i64, b: u64, c: i32,}str

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

圖片圖片3dp28資訊網(wǎng)——每日最新資訊28at.com

題圖忘了來自哪里..3dp28資訊網(wǎng)——每日最新資訊28at.com

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

整型,浮點型,struct,vec!,enum

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

本文是對 Rust內(nèi)存布局[1] 的學(xué)習(xí)與記錄3dp28資訊網(wǎng)——每日最新資訊28at.com

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

struct A {    a: i64,    b: u64,}struct B {    a: i32,    b: u64,}struct C {    a: i64,    b: u64,    c: i32,}struct D {    a: i32,    b: u64,    c: i32,    d: u64,}fn main() {    println!("i32類型占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<i32>());    println!("i64類型占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<i64>());    println!(        "[i64;4]占的內(nèi)存空間為:{}字節(jié)",        std::mem::size_of::<[i64; 4]>()    );    println!("結(jié)構(gòu)體A占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<A>());    println!("結(jié)構(gòu)體B占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<B>());    println!("結(jié)構(gòu)體C占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<C>());    println!("結(jié)構(gòu)體D占的內(nèi)存空間為:{}字節(jié)", std::mem::size_of::<D>());}

輸出3dp28資訊網(wǎng)——每日最新資訊28at.com

i32類型占的內(nèi)存空間為:4字節(jié)i64類型占的內(nèi)存空間為:8字節(jié)[i64;4]占的內(nèi)存空間為:32字節(jié)結(jié)構(gòu)體A占的內(nèi)存空間為:16字節(jié)結(jié)構(gòu)體B占的內(nèi)存空間為:16字節(jié)結(jié)構(gòu)體C占的內(nèi)存空間為:24字節(jié)結(jié)構(gòu)體D占的內(nèi)存空間為:24字節(jié)

沒啥好說的,和Go一樣,struct會存在內(nèi)存對齊/內(nèi)存填充(8字節(jié)對齊)3dp28資訊網(wǎng)——每日最新資訊28at.com

D是因為編譯器會優(yōu)化內(nèi)存布局,字段順序重排3dp28資訊網(wǎng)——每日最新資訊28at.com

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

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

Rust中的Vec!和Go中的slice差不多,都是占24Byte,三個字段3dp28資訊網(wǎng)——每日最新資訊28at.com

struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}fn main() {    println!(        "Vec!類型占的內(nèi)存空間為:{}字節(jié)",        std::mem::size_of::<SimpleVec<i32>>()    );    println!(        "Option<i64>類型占的內(nèi)存空間為:{}字節(jié)",        std::mem::size_of::<Option<i64>>()    );}
Vec!類型占的內(nèi)存空間為:24字節(jié)Option<i64>類型占的內(nèi)存空間為:16字節(jié)

但是對于enum類型,3dp28資訊網(wǎng)——每日最新資訊28at.com

會有一個tag字段,uint64,來標(biāo)記變體,是None值還是Some值3dp28資訊網(wǎng)——每日最新資訊28at.com

struct Option {    uint64 tag; // 占8字節(jié) Some None    i64; //實際存放的數(shù)據(jù)}

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

struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}enum Data {    // tag,uint64,8字節(jié)    I32(i32),             //  4字節(jié),但需內(nèi)存對齊到8字節(jié)?    F64(f64),             // 8字節(jié)    Bytes(SimpleVec<u8>), // 24字節(jié)}fn main() {    println!(        "Data這個Enum類型占的內(nèi)存空間為:{}字節(jié)",        std::mem::size_of::<Data>()    );}

輸出為:3dp28資訊網(wǎng)——每日最新資訊28at.com

Data這個Enum類型占的內(nèi)存空間為:32字節(jié)3dp28資訊網(wǎng)——每日最新資訊28at.com

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

Rust的enum類似C++ std::variant的實現(xiàn)(大致是用union實現(xiàn)的)3dp28資訊網(wǎng)——每日最新資訊28at.com

union的內(nèi)存大小是其成員中最大的那個成員的大小,3dp28資訊網(wǎng)——每日最新資訊28at.com

類似的,對于Data這個Enum類型,會選擇最大的那個成員的大小3dp28資訊網(wǎng)——每日最新資訊28at.com

所以24+tag的8字節(jié),最終為32字節(jié) (tag在這里就用來標(biāo)識其為i32,還是f64,或者是Vec)3dp28資訊網(wǎng)——每日最新資訊28at.com

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

嵌套的枚舉:3dp28資訊網(wǎng)——每日最新資訊28at.com

struct SimpleVec<T> {    len: usize,      // 8    capacity: usize, //8    data: *mut T,    //8}enum Data {    // tag,uint64,8字節(jié)    I32(i32),             //  4字節(jié),但需內(nèi)存對齊到8字節(jié)?    F64(f64),             // 8字節(jié)    Bytes(SimpleVec<u8>), // 24字節(jié)}type OptData = Option<Data>;fn main() {    println!(        "OptData這個Option類型占的內(nèi)存空間為:{}字節(jié)",        std::mem::size_of::<OptData>()    );}

輸出:3dp28資訊網(wǎng)——每日最新資訊28at.com

OptData這個Option類型占的內(nèi)存空間為:32字節(jié)3dp28資訊網(wǎng)——每日最新資訊28at.com

因為編譯器會對嵌套的枚舉類型進(jìn)行優(yōu)化,會將其tag展開, 把多個tag合在一起了,類似下面:3dp28資訊網(wǎng)——每日最新資訊28at.com

展開變成一個枚舉(None是uint64,能標(biāo)識非常多信息)3dp28資訊網(wǎng)——每日最新資訊28at.com

type OptData = Option<Data>;enum Option {    Some,    None,}enum OptData_ {    I32(i32);    F64(f64);    Bytes(SimpleVec<u8>),    None}

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

元組tuple

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

rust中的元組大小固定嗎?3dp28資訊網(wǎng)——每日最新資訊28at.com

在Rust中,元組的大小是固定的。這里解釋一下元組大小固定的含義:3dp28資訊網(wǎng)——每日最新資訊28at.com

  • 元組中的元素類型和數(shù)量在編譯期就已經(jīng)確定,不能在運(yùn)行期修改。
  • 編譯器會根據(jù)元組中元素的類型,預(yù)先分配足夠的內(nèi)存用于存儲這些元素。
  • 元組的內(nèi)存布局和大小也在編譯期就確定下來了,運(yùn)行期不會改變。
  • 嘗試創(chuàng)建包含不同類型或數(shù)量元素的元組,是編譯時錯誤。

舉個例子:3dp28資訊網(wǎng)——每日最新資訊28at.com

let tuple = (1, 2.0, "three");

這里元組包含一個i32,一個f64和一個字符串。編譯器會預(yù)先知道:3dp28資訊網(wǎng)——每日最新資訊28at.com

  • 元組元素類型為i32, f64, &str
  • i32占用4字節(jié),f64占用8字節(jié),&str占據(jù)一個指針的空間
  • 所以該元組占用的內(nèi)存大小為4 + 8 + 8 = 20字節(jié)

這20字節(jié)的內(nèi)存在編譯時就已分配,運(yùn)行期不會改變。3dp28資訊網(wǎng)——每日最新資訊28at.com

如果后續(xù)試圖給這個元組添加或減少元素,編譯都會報錯。3dp28資訊網(wǎng)——每日最新資訊28at.com

所以說,元組的大小和內(nèi)容是固定的,這是Rust實現(xiàn)方式的一部分。3dp28資訊網(wǎng)——每日最新資訊28at.com

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

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

更多可參考Rust 數(shù)據(jù)內(nèi)存布局[2]3dp28資訊網(wǎng)——每日最新資訊28at.com

參考資料

[1]Rust內(nèi)存布局: https://www.bilibili.com/video/BV1Bm4y1c71r3dp28資訊網(wǎng)——每日最新資訊28at.com

[2]Rust 數(shù)據(jù)內(nèi)存布局: https://blog.csdn/techdashen/article/details/1202573233dp28資訊網(wǎng)——每日最新資訊28at.com

本文鏈接:http://www.tebozhan.com/showinfo-26-34571-0.html一篇學(xué)會 Rust 內(nèi)存布局

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

上一篇: Python爬蟲神器:Beautiful Soup指南,輕松解析網(wǎng)頁數(shù)據(jù)!

下一篇: 事務(wù)管理 vs. 鎖控制:你真的分得清嗎?

標(biāo)簽:
  • 熱門焦點
  • Raft算法:保障分布式系統(tǒng)共識的穩(wěn)健之道

    1. 什么是Raft算法?Raft 是英文”Reliable、Replicated、Redundant、And Fault-Tolerant”(“可靠、可復(fù)制、可冗余、可容錯”)的首字母縮寫。Raft算法是一種用于在分布式系統(tǒng)
  • 三言兩語說透設(shè)計模式的藝術(shù)-簡單工廠模式

    一、寫在前面工廠模式是最常見的一種創(chuàng)建型設(shè)計模式,通常說的工廠模式指的是工廠方法模式,是使用頻率最高的工廠模式。簡單工廠模式又稱為靜態(tài)工廠方法模式,不屬于GoF 23種設(shè)計
  • 不容錯過的MSBuild技巧,必備用法詳解和實踐指南

    一、MSBuild簡介MSBuild是一種基于XML的構(gòu)建引擎,用于在.NET Framework和.NET Core應(yīng)用程序中自動化構(gòu)建過程。它是Visual Studio的構(gòu)建引擎,可在命令行或其他構(gòu)建工具中使用
  • 只需五步,使用start.spring.io快速入門Spring編程

    步驟1打開https://start.spring.io/,按照屏幕截圖中的內(nèi)容創(chuàng)建項目,添加 Spring Web 依賴項,并單擊“生成”按鈕下載 .zip 文件,為下一步做準(zhǔn)備。請在進(jìn)入步驟2之前進(jìn)行解壓。圖
  • .NET 程序的 GDI 句柄泄露的再反思

    一、背景1. 講故事上個月我寫過一篇 如何洞察 C# 程序的 GDI 句柄泄露 文章,當(dāng)時用的是 GDIView + WinDbg 把問題搞定,前者用來定位泄露資源,后者用來定位泄露代碼,后面有朋友反
  • 2天漲粉255萬,又一賽道在抖音爆火

    來源:運(yùn)營研究社作者 | 張知白編輯 | 楊佩汶設(shè)計 | 晏談夢潔這個暑期,旅游賽道徹底火了:有的「地方」火了&mdash;&mdash;貴州村超旅游收入 1 個月超過 12 億;有的「博主」火了&m
  • 騰訊VS網(wǎng)易,最卷游戲暑期檔,誰能笑到最后?

    作者:無銹缽來源:財經(jīng)無忌7月16日晚,上海1862時尚藝術(shù)中心。伴隨著幻象的精準(zhǔn)命中,碩大的熒幕之上,比分被定格在了14:12,被寄予厚望的EDG戰(zhàn)隊以絕對的優(yōu)勢戰(zhàn)勝了BLG戰(zhàn)隊,拿下了總決
  • 2納米決戰(zhàn)2025

    集微網(wǎng)報道 從三強(qiáng)爭霸到四雄逐鹿,2nm的廝殺聲已然隱約傳來。無論是老牌勁旅臺積電、三星,還是誓言重回先進(jìn)制程領(lǐng)先地位的英特爾,甚至初成立不久的新
  • 英特爾Xe HPG游戲顯卡:擁有512EU,單風(fēng)扇版本

    據(jù)10 月 30 日外媒 TheVerge 消息報道,英特爾 Xe HPG Arc Alchemist 的正面實被曝光,不僅擁有 512 EU 版顯卡,還擁有 128EU 的單風(fēng)扇版本。另外,這款顯卡 PCB
Top