欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

rust中智能指針的實(shí)現(xiàn)

 更新時(shí)間:2025年06月27日 09:44:02   作者:pumpkin84514  
Rust智能指針通過所有權(quán)實(shí)現(xiàn)資源自動(dòng)管理,包含Box、Rc、Arc、Mutex等類型,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧

1、 什么是智能指針?Rust 三類指針對(duì)比

類型安全性借用檢查是否自動(dòng)釋放功能特點(diǎn)
&T, &mut T? 是? 是? 是借用引用,不擁有數(shù)據(jù)
*const T, *mut T? 否? 否? 否原生裸指針,用于 FFI、底層控制
智能指針(如 Box)? 是? 是/部分? 是擁有數(shù)據(jù),帶有自動(dòng)釋放和額外功能

?? 智能指針本質(zhì)是一個(gè)擁有值的結(jié)構(gòu)體,實(shí)現(xiàn)了 Deref 和 Drop,讓你可以像指針一樣訪問值,又能自動(dòng)釋放資源。

2、原生指針 *const T:危險(xiǎn)但有用

fn main() {
    let x = 5;
    let p: *const i32 = &x; // 獲取原生指針

    unsafe {
        println!("值是:{}", *p); // 只有在 unsafe 代碼塊中才能解引用
    }
}

? 只讀,不會(huì)自動(dòng)釋放。
? 無生命周期、越界檢查,容易懸垂。
?? 用于與 C 語(yǔ)言交互或?qū)崿F(xiàn)底層結(jié)構(gòu)。

手動(dòng)釋放:Box::into_raw / from_raw

fn main() {
    let b = Box::new(42);
    let ptr = Box::into_raw(b);         // 轉(zhuǎn)換為裸指針,不再自動(dòng)釋放

    unsafe {
        let b2 = Box::from_raw(ptr);    // 重新接管所有權(quán)
        println!("恢復(fù)值:{}", b2);
    } // 自動(dòng)釋放
}

?? 記住:誰(shuí) into_raw,誰(shuí)就必須 from_raw,否則泄漏!

3、常見智能指針逐個(gè)講清

Box:在堆上分配值

fn main() {
    let b = Box::new(100);              // 將整數(shù) 100 放到堆上
    println!("b 的值是:{}", *b);       // 解引用訪問
} // 離開作用域自動(dòng)釋放(RAII)

適合:大對(duì)象、遞歸結(jié)構(gòu)、強(qiáng)制所有權(quán)轉(zhuǎn)移。

Rc:?jiǎn)尉€程引用計(jì)數(shù)共享

use std::rc::Rc;

fn main() {
    let a = Rc::new("hello".to_string());
    let b = Rc::clone(&a);              // 引用計(jì)數(shù) +1
    println!("a = {}, b = {}", a, b);   // 多個(gè)變量共享同一塊內(nèi)存
}

適合:多個(gè)地方共享不可變數(shù)據(jù),如圖結(jié)構(gòu)、緩存。
?? 注意:不能用于多線程。

RefCell / Cell:內(nèi)部可變性

use std::cell::RefCell;

fn main() {
    let x = RefCell::new(10);           // 創(chuàng)建可變?nèi)萜?
    *x.borrow_mut() += 5;               // 可變借用
    println!("當(dāng)前值: {}", x.borrow());
}
  • RefCell:運(yùn)行時(shí)借用檢查,支持引用。
  • Cell:適合 Copy 類型的值,用 get/set 讀寫。

Cow:寫時(shí)復(fù)制,節(jié)省資源

use std::borrow::Cow;

fn modify(input: Cow<str>) -> Cow<str> {
    if input.contains("x") {
        Cow::Owned(input.replace("x", "y")) // 真要改時(shí)才復(fù)制
    } else {
        input
    }
}

fn main() {
    let s = Cow::Borrowed("hexo");
    let result = modify(s);
    println!("結(jié)果:{}", result);
}

適合:讀取多、寫入少的場(chǎng)景,如配置、模板處理。

Option 與智能指針

fn get_name() -> Option<&'static str> {
    Some("Tom")
}

fn main() {
    if let Some(name) = get_name() {
        println!("找到名字:{}", name);
    }
}

Option 表示“可能有值”或“無值”,智能指針經(jīng)常作為 Option 的值使用,用于“延遲初始化”。

4、 并發(fā)智能指針

Arc:線程安全引用計(jì)數(shù)

use std::sync::Arc;

fn main() {
    let a = Arc::new(42);
    let b = Arc::clone(&a);
    println!("a = {}, b = {}", a, b);
}

?? 與 Rc 類似,但用原子操作實(shí)現(xiàn),適合多線程。

Mutex:互斥鎖保護(hù)數(shù)據(jù)

use std::sync::Mutex;

fn main() {
    let m = Mutex::new(0);
    {
        let mut data = m.lock().unwrap();
        *data += 1;
    }
    println!("當(dāng)前值: {:?}", m);
}

?? 一次只能一個(gè)線程修改。

RwLock:讀多寫少,效率高

use std::sync::RwLock;

fn main() {
    let lock = RwLock::new(10);

    {
        let r1 = lock.read().unwrap();
        let r2 = lock.read().unwrap();
        println!("讀者1: {}, 讀者2: {}", r1, r2);
    }

    {
        let mut w = lock.write().unwrap();
        *w += 10;
    }

    println!("寫后值: {}", *lock.read().unwrap());
}

AtomicUsize:無鎖計(jì)數(shù)器

use std::sync::atomic::{AtomicUsize, Ordering};

fn main() {
    let counter = AtomicUsize::new(0);
    counter.fetch_add(1, Ordering::SeqCst); // 原子 +1
    println!("計(jì)數(shù)器值: {}", counter.load(Ordering::SeqCst));
}

適合:高性能并發(fā)狀態(tài)計(jì)數(shù),如連接數(shù)、任務(wù)狀態(tài)。

5、高階用法組合:Arc<Mutex>

use std::sync::{Arc, Mutex};
use std::thread;

fn main() {
    let counter = Arc::new(Mutex::new(0));
    let mut handles = vec![];

    for _ in 0..10 {
        let c = Arc::clone(&counter);
        let handle = thread::spawn(move || {
            let mut num = c.lock().unwrap();
            *num += 1;
        });
        handles.push(handle);
    }

    for h in handles {
        h.join().unwrap();
    }

    println!("最終結(jié)果: {}", *counter.lock().unwrap());
}

6、深入進(jìn)階:Weak / Pin / UnsafeCell

Weak:打破 Rc/Arc 的循環(huán)引用

use std::rc::{Rc, Weak};
use std::cell::RefCell;

struct Node {
    next: RefCell<Option<Rc<Node>>>,
    prev: RefCell<Option<Weak<Node>>>, // 使用弱引用避免循環(huán)
}

?? Rc::downgrade(&rc) 轉(zhuǎn)換為 Weak,不計(jì)入引用計(jì)數(shù)
?? .upgrade() 返回 Option<Rc>

Pin:防止對(duì)象被移動(dòng)

use std::pin::Pin;

fn main() {
    let data = String::from("hello");
    let pinned = Pin::new(&data);
    println!("{}", pinned);
}

?? 用于 Future、self-referential 結(jié)構(gòu)
?? Box::pin() 可固定對(duì)象

UnsafeCell:RefCell/Mutex 背后的魔法

use std::cell::UnsafeCell;

struct MyType {
    data: UnsafeCell<i32>,
}

unsafe impl Sync for MyType {}

fn main() {
    let x = MyType { data: UnsafeCell::new(0) };

    unsafe {
        *x.data.get() = 42;
        println!("{}", *x.data.get());
    }
}

?? 允許穿透不可變引用進(jìn)行修改,底層實(shí)現(xiàn) RefCell、Mutex

場(chǎng)景速查表

類型線程安全可變性常見用途
Box? 否? 是所有權(quán)轉(zhuǎn)移,遞歸結(jié)構(gòu)
Rc? 否? 否單線程共享只讀數(shù)據(jù)
RefCell? 否? 是內(nèi)部可變性,運(yùn)行時(shí)借用檢查
Cell? 否? 是Copy 類型小數(shù)據(jù)的替換
Cow? 是? 是寫時(shí)復(fù)制,節(jié)省資源
Arc? 是? 否多線程只讀共享
Mutex? 是? 是多線程可變共享
RwLock? 是? 是多讀單寫
AtomicUsize? 是? 是無鎖計(jì)數(shù)器,高性能狀態(tài)共享
Weak? 是? 否打破 Rc/Arc 循環(huán)引用
Pin? 是? 否防止移動(dòng),適用于異步/自引用結(jié)構(gòu)
UnsafeCell?(需手動(dòng)保證)? 是RefCell / Mutex 的底層支撐

總結(jié)建議

  • 智能指針 = 擁有數(shù)據(jù) + 自動(dòng)管理資源 + 像引用一樣使用
  • Rc、RefCell 是組合神器,但要小心引用環(huán)
  • Arc + Mutex 是并發(fā)安全的常見搭配
  • 遇到底層問題,了解 Pin / UnsafeCell 能更深入掌握 Rust 內(nèi)存模型

到此這篇關(guān)于rust中智能指針的實(shí)現(xiàn)的文章就介紹到這了,更多相關(guān)rust 智能指針內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家! 

相關(guān)文章

  • Rust的slab庫(kù)使用場(chǎng)景分析

    Rust的slab庫(kù)使用場(chǎng)景分析

    slab 是一個(gè)輕量級(jí)、高性能的工具,非常適合管理固定大小的資源集合,尤其是在網(wǎng)絡(luò)編程和事件驅(qū)動(dòng)架構(gòu)中,這篇文章主要介紹了Rust的slab庫(kù)使用教程,需要的朋友可以參考下
    2024-12-12
  • 使用Rust實(shí)現(xiàn)日志記錄功能

    使用Rust實(shí)現(xiàn)日志記錄功能

    這篇文章主要為大家詳細(xì)介紹了使用Rust實(shí)現(xiàn)日志記錄功能的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,有需要的可以參考一下
    2024-04-04
  • Rust中的panic定義及觸發(fā)條件詳解

    Rust中的panic定義及觸發(fā)條件詳解

    這篇文章主要為大家介紹了Rust中的panic定義及觸發(fā)條件詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪
    2023-04-04
  • 一文詳解Rust中的錯(cuò)誤處理

    一文詳解Rust中的錯(cuò)誤處理

    這篇文章主要為大家詳細(xì)介紹了Rust中的錯(cuò)誤處理的相關(guān)知識(shí),文中的示例代碼講解詳細(xì),具有一定的借鑒價(jià)值,感興趣的小伙伴可以跟隨小編一起學(xué)習(xí)一下
    2024-01-01
  • Rust語(yǔ)言中的哈希表

    Rust語(yǔ)言中的哈希表

    哈希表也是集合中的一種,也是最常用的集合形式,目前Rust語(yǔ)言核心部分沒有對(duì)哈希表進(jìn)行實(shí)現(xiàn),是使用標(biāo)準(zhǔn)庫(kù)提供的,這篇文章主要介紹了Rust語(yǔ)言之哈希表,需要的朋友可以參考下
    2024-02-02
  • rust智能指針的具體使用

    rust智能指針的具體使用

    智能指針是一些數(shù)據(jù)結(jié)構(gòu),它們的行為類似于指針但擁有額外的元數(shù)據(jù)和附加功能,本文就來介紹一下rust智能指針的具體使用,感興趣的可以了解一下
    2023-12-12
  • Rust 文檔注釋功能示例代碼

    Rust 文檔注釋功能示例代碼

    Rust的文檔注釋使用特定的格式,以便通過 rustdoc工具生成 API 文檔,本文給大家介紹Rust 文檔注釋功能,感興趣的朋友跟隨小編一起看看吧
    2024-04-04
  • Rust中的內(nèi)部可變性與RefCell<T>詳解

    Rust中的內(nèi)部可變性與RefCell<T>詳解

    內(nèi)部可變性允許在不可變引用中修改內(nèi)部數(shù)據(jù),通過RefCell在運(yùn)行時(shí)檢查借用規(guī)則,適用于Mock對(duì)象和多所有權(quán)的可變性場(chǎng)景,結(jié)合Rc和RefCell實(shí)現(xiàn)多所有者共享并修改數(shù)據(jù),但僅適用于單線程
    2025-02-02
  • Rust中的引用與借用舉例詳解

    Rust中的引用與借用舉例詳解

    這篇文章主要給大家介紹了關(guān)于Rust中引用與借用的相關(guān)資料,rust中借用和引用的附帶功效都一樣,就是都有生命周期,文中通過代碼介紹的非常詳細(xì),對(duì)大家學(xué)習(xí)或者使用Rust具有一定的參考價(jià)值,需要的朋友可以參考下
    2023-11-11
  • rust如何解析json數(shù)據(jù)舉例詳解

    rust如何解析json數(shù)據(jù)舉例詳解

    這篇文章主要給大家介紹了關(guān)于rust如何解析json數(shù)據(jù)的相關(guān)資料,SON 格式非常輕量級(jí),因此它非常適合在網(wǎng)絡(luò)中傳輸大量數(shù)據(jù),文中通過代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2023-11-11

最新評(píng)論