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

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

一篇學會 Rust 內存布局

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

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

圖片圖片xVJ28資訊網——每日最新資訊28at.com

題圖忘了來自哪里..xVJ28資訊網——每日最新資訊28at.com

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

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

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

本文是對 Rust內存布局[1] 的學習與記錄xVJ28資訊網——每日最新資訊28at.com

xVJ28資訊網——每日最新資訊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類型占的內存空間為:{}字節", std::mem::size_of::<i32>());    println!("i64類型占的內存空間為:{}字節", std::mem::size_of::<i64>());    println!(        "[i64;4]占的內存空間為:{}字節",        std::mem::size_of::<[i64; 4]>()    );    println!("結構體A占的內存空間為:{}字節", std::mem::size_of::<A>());    println!("結構體B占的內存空間為:{}字節", std::mem::size_of::<B>());    println!("結構體C占的內存空間為:{}字節", std::mem::size_of::<C>());    println!("結構體D占的內存空間為:{}字節", std::mem::size_of::<D>());}

輸出xVJ28資訊網——每日最新資訊28at.com

i32類型占的內存空間為:4字節i64類型占的內存空間為:8字節[i64;4]占的內存空間為:32字節結構體A占的內存空間為:16字節結構體B占的內存空間為:16字節結構體C占的內存空間為:24字節結構體D占的內存空間為:24字節

沒啥好說的,和Go一樣,struct會存在內存對齊/內存填充(8字節對齊)xVJ28資訊網——每日最新資訊28at.com

D是因為編譯器會優化內存布局,字段順序重排xVJ28資訊網——每日最新資訊28at.com

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

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

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

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

但是對于enum類型,xVJ28資訊網——每日最新資訊28at.com

會有一個tag字段,uint64,來標記變體,是None值還是Some值xVJ28資訊網——每日最新資訊28at.com

struct Option {    uint64 tag; // 占8字節 Some None    i64; //實際存放的數據}

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

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

輸出為:xVJ28資訊網——每日最新資訊28at.com

Data這個Enum類型占的內存空間為:32字節xVJ28資訊網——每日最新資訊28at.com

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

Rust的enum類似C++ std::variant的實現(大致是用union實現的)xVJ28資訊網——每日最新資訊28at.com

union的內存大小是其成員中最大的那個成員的大小,xVJ28資訊網——每日最新資訊28at.com

類似的,對于Data這個Enum類型,會選擇最大的那個成員的大小xVJ28資訊網——每日最新資訊28at.com

所以24+tag的8字節,最終為32字節 (tag在這里就用來標識其為i32,還是f64,或者是Vec)xVJ28資訊網——每日最新資訊28at.com

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

嵌套的枚舉:xVJ28資訊網——每日最新資訊28at.com

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

輸出:xVJ28資訊網——每日最新資訊28at.com

OptData這個Option類型占的內存空間為:32字節xVJ28資訊網——每日最新資訊28at.com

因為編譯器會對嵌套的枚舉類型進行優化,會將其tag展開, 把多個tag合在一起了,類似下面:xVJ28資訊網——每日最新資訊28at.com

展開變成一個枚舉(None是uint64,能標識非常多信息)xVJ28資訊網——每日最新資訊28at.com

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

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

元組tuple

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

rust中的元組大小固定嗎?xVJ28資訊網——每日最新資訊28at.com

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

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

舉個例子:xVJ28資訊網——每日最新資訊28at.com

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

這里元組包含一個i32,一個f64和一個字符串。編譯器會預先知道:xVJ28資訊網——每日最新資訊28at.com

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

這20字節的內存在編譯時就已分配,運行期不會改變。xVJ28資訊網——每日最新資訊28at.com

如果后續試圖給這個元組添加或減少元素,編譯都會報錯。xVJ28資訊網——每日最新資訊28at.com

所以說,元組的大小和內容是固定的,這是Rust實現方式的一部分。xVJ28資訊網——每日最新資訊28at.com

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

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

更多可參考Rust 數據內存布局[2]xVJ28資訊網——每日最新資訊28at.com

參考資料

[1]Rust內存布局: https://www.bilibili.com/video/BV1Bm4y1c71rxVJ28資訊網——每日最新資訊28at.com

[2]Rust 數據內存布局: https://blog.csdn/techdashen/article/details/120257323xVJ28資訊網——每日最新資訊28at.com

本文鏈接:http://www.www897cc.com/showinfo-26-34571-0.html一篇學會 Rust 內存布局

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

上一篇: Python爬蟲神器:Beautiful Soup指南,輕松解析網頁數據!

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

標簽:
  • 熱門焦點
Top 主站蜘蛛池模板: 海原县| 香港 | 紫金县| 礼泉县| 康马县| 深水埗区| 闽侯县| 修文县| 阳山县| 沙湾县| 新河县| 旬阳县| 广昌县| 龙陵县| 江山市| 彭阳县| 溆浦县| 五家渠市| 休宁县| 昌黎县| 涟源市| 乐安县| 化州市| 久治县| 宁夏| 罗江县| 白河县| 咸阳市| 河西区| 津南区| 成都市| 布拖县| 乐山市| 邳州市| 七台河市| 嘉定区| 益阳市| 沛县| 泗水县| 铁岭市| 甘肃省|