亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

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

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

1、 什么是智能指針?Rust 三類指針對比

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

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

2、原生指針 *const T:危險但有用

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

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

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

手動釋放:Box::into_raw / from_raw

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

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

?? 記?。?strong>誰 into_raw,誰就必須 from_raw,否則泄漏!

3、常見智能指針逐個講清

Box:在堆上分配值

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

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

Rc:單線程引用計數(shù)共享

use std::rc::Rc;

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

適合:多個地方共享不可變數(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)行時借用檢查,支持引用。
  • Cell:適合 Copy 類型的值,用 get/set 讀寫。

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

use std::borrow::Cow;

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

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

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

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:線程安全引用計數(shù)

use std::sync::Arc;

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

?? 與 Rc 類似,但用原子操作實現(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);
}

?? 一次只能一個線程修改。

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:無鎖計數(shù)器

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

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

適合:高性能并發(fā)狀態(tài)計數(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,不計入引用計數(shù)
?? .upgrade() 返回 Option<Rc>

Pin:防止對象被移動

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() 可固定對象

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)行修改,底層實現(xiàn) RefCell、Mutex

場景速查表

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

總結(jié)建議

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

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

相關(guān)文章

  • Rust的slab庫使用場景分析

    Rust的slab庫使用場景分析

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

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

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

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

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

    一文詳解Rust中的錯誤處理

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

    Rust語言中的哈希表

    哈希表也是集合中的一種,也是最常用的集合形式,目前Rust語言核心部分沒有對哈希表進(jìn)行實現(xiàn),是使用標(biāo)準(zhǔn)庫提供的,這篇文章主要介紹了Rust語言之哈希表,需要的朋友可以參考下
    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)行時檢查借用規(guī)則,適用于Mock對象和多所有權(quán)的可變性場景,結(jié)合Rc和RefCell實現(xiàn)多所有者共享并修改數(shù)據(jù),但僅適用于單線程
    2025-02-02
  • Rust中的引用與借用舉例詳解

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

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

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

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

最新評論