一区二区三区日韩精品-日韩经典一区二区三区-五月激情综合丁香婷婷-欧美精品中文字幕专区

分享

Rust中的各種指針

 lichwoo 2021-07-05


Rust 中的指針大體可以分為以下四種:

  1. 引用 references

  2. “胖指針 fat pointers”(該分類存有爭議

  3. 智能指針 smart pointers

  4. 裸指針 raw pointers

1. 引用

就是直接對一個變量執(zhí)行 &、&mut 操作,永遠不會為 null。
其占用的大小與 usize 一致。

與引用相關的一個名詞是 借用(borrowing)。
其定義為:將獲取引用作為函數(shù)參數(shù)稱為 借用(borrowing)

fn test_ref(){    let mut num = 5;    let num_ref = &mut num;    *num_ref = 100;    println!("{} sizeof &i32 {}", num, std::mem::size_of::<&i32>())    // output 100 sizeof &i32:8}

2. 胖指針

比引用多了些其它數(shù)據(jù)。
在 rust 中,屬于胖指針的數(shù)據(jù):切片( &[T] )。 T 為切片內元素的類型。
切片類型存有: "地址(ptr) + 長度(len) "兩個字段。
圖中紅框內,就是一個切片。

fn test_fat_pointers(){    let mut arr = [1, 2, 3, 4];    let slice = &mut arr[1..4];    slice[0] = 100;    println!("{:?}", arr);   // [1, 100, 3, 4]    let slice = &arr[1..4];    println!("{:p} {:?}", slice, unsafe { transmute::<_, (usize, usize)>(slice) });    // Output: 0x8a6c0ff4ac (594518471852, 3)    //      0x8a6c0ff4ac 594518471852 這兩個值是相等的。    //      (594518471852, 3) 分別表示 具體數(shù)據(jù)的堆地址 和 長度 兩個字段。    //      注意這里是用 slice,而不是 &slice。(&slice表示這個變量本身的棧地址)    println!("sizeof &[i32]:{}", std::mem::size_of::<&[i32]>());    // Output: sizeof &[i32]:16    // 因為包含了兩個字段:地址 + 長度,所以其占用內存為 2 個 usize 類型大小}

3. 智能指針

有特殊功能的,實現(xiàn)了 Deref、drop 相關的trait。

在 rust 中,屬于智能指針的數(shù)據(jù):String、 Vec<T>、Box、Cell、Rc 等等。

每一個智能指針的實現(xiàn)都不大一樣,這里就不再展開敘述。
僅以 Box 舉例:

fn test_smart_pointers(){    // 將本應存在棧上的地址,存在了堆上    let mut num = Box::new(1);    // num_address 指向 box 里面的具體內容(也就是儲存在堆上的數(shù)值 1)    let num_address : *mut i32 = &mut *num;    unsafe {        *num_address = 100    }    println!("{}", *num + 100)     // Output: 200}

4. 裸指針

類似 C 語言里面的指針,可以為 null !

創(chuàng)建裸指針,是 safe 的,讀寫裸指針,才需要 unsafe !

裸指針又可以分為可變、不可變,分別寫作 *mut T 和 *const T

這里的星號不是解引用運算符,它是類型名稱的一部分。

這里的 T 表示指針指向的具體類型,裸指針本身的的類型大小與 usize 一致。

評論區(qū)有朋友指出:裸指針也能指向不定長類型,而且跟指向不定長類型的引用具有一樣的內存布局。所以調用 sizeof,獲得的大小是原始類型的大小。
(不過指針這個變量本身的占用大小應該還是 一個 usize)
詳見評論區(qū)的討論
fn test_raw_pointers(){    let mut num = 1;    // 將引用轉為裸指針    let num_raw_point = &mut num as *mut i32;    unsafe {        *num_raw_point = 100;        println!("{} {} {:p}", num, *num_raw_point, &num);         // Output: 100 100 0x8d8c6ff6bc    }    let address = num_raw_point as usize;    // 將一個 usize 對象,轉化為 裸指針    let raw = address as *mut i32;    unsafe {        *raw = 200;        println!("{} {} {:p} {}", num, *num_raw_point, &num, address);        // Output: 200 200 0x8d8c6ff6bc 607946536636    }}

    本站是提供個人知識管理的網(wǎng)絡存儲空間,所有內容均由用戶發(fā)布,不代表本站觀點。請注意甄別內容中的聯(lián)系方式、誘導購買等信息,謹防詐騙。如發(fā)現(xiàn)有害或侵權內容,請點擊一鍵舉報。
    轉藏 分享 獻花(0

    0條評論

    發(fā)表

    請遵守用戶 評論公約

    類似文章 更多

    一区二区三区18禁看| 日韩视频在线观看成人| 色婷婷视频免费在线观看| 国产成人亚洲综合色就色| 熟妇人妻av中文字幕老熟妇| 欧美日韩国产一级91| 五月婷婷六月丁香狠狠| 欧美日韩在线视频一区| 丁香六月啪啪激情综合区| 欧美成人免费视频午夜色| 色一欲一性一乱—区二区三区| 欧美日韩一区二区三区色拉拉| 欧美精品亚洲精品日韩精品| 东京热男人的天堂久久综合| 少妇福利视频一区二区| 免费国产成人性生活生活片| 日韩精品一级片免费看| 成人国产激情福利久久| 九九热这里有精品20| 欧美黑人暴力猛交精品| 日本在线 一区 二区| 欧美熟妇喷浆一区二区| 亚洲国产av在线视频| 开心久久综合激情五月天| 亚洲中文字幕人妻av| 亚洲日本久久国产精品久久| 国产户外勾引精品露出一区| 欧美日韩国产另类一区二区| 美女被后入视频在线观看| 国产精品日韩欧美第一页| 日韩中文字幕人妻精品| 午夜福利92在线观看| 精品日韩视频在线观看| 国产熟女一区二区不卡| 国产精品激情对白一区二区| 久久久精品日韩欧美丰满| 激情中文字幕在线观看| 高清一区二区三区不卡免费| 日韩欧美91在线视频| 亚洲国产成人久久一区二区三区| 激情图日韩精品中文字幕|