Rust中基本數(shù)據(jù)類型(如整數(shù)、浮點(diǎn)數(shù)、布爾值等)通常存儲在棧上。而動態(tài)分配的數(shù)據(jù),如Box<T>
和Vec<T>
等,存儲在堆上。
Box 智能指針
Rust 中 Box 是一種智能指針類型,通常用于將值放置在堆上而不是棧上。在 Rust 中,由于所有值的默認(rèn)生命周期都在當(dāng)前作用域結(jié)束時結(jié)束,因此在情況需要延長對象的生命周期時,可以使用 Box 來將對象存儲在堆上,以便在它們的所有權(quán)結(jié)束之前對它們進(jìn)行訪問。
struct User {
name: String,
age: i32,
}
fn main() {
// 創(chuàng)建一個 User 對象,并將其存儲在 Box 智能指針中
let user = Box::new(User {
name: "test".to_string(),
age: 18,
});
// 通過解引用運(yùn)算符來訪問結(jié)構(gòu)體對象的字段
println!("name = {}", (*user).name);
println!("age = {}", (*user).age);
// 創(chuàng)建一個字符串對象,并將其存儲在 Box 智能指針中
let str = Box::new(String::from("Hello, World!"));
// 通過解引用運(yùn)算符來訪問字符串對象中的字符
println!("Character at index 7 = {}", (*str).chars().nth(7).unwrap());
}
Rc 智能指針
Rust 中的 Rc 類型是一個引用計(jì)數(shù)智能指針,它允許多個所有者共享相同的數(shù)據(jù)。每次創(chuàng)建一個 Rc 實(shí)例時,都會增加一個引用計(jì)數(shù),并在所有者之間共享這個計(jì)數(shù)。當(dāng)沒有所有者時,引用計(jì)數(shù)將遞減,一旦它達(dá)到零,數(shù)據(jù)將被釋放。
use std::rc::Rc;
fn main() {
let str = Rc::new("Hello, world!");
// 獲取引用計(jì)數(shù)為 1
println!("strong_count: {}", Rc::strong_count(&str));
// 創(chuàng)建一個新的所有者
let str2 = Rc::clone(&str);
// 獲取引用計(jì)數(shù)為 2
println!("strong_count: {}", Rc::strong_count(&str));
println!("strong_count: {}", Rc::strong_count(&str2));
}
Arc 智能指針
Rust 中的 Arc 類型是一個原子引用計(jì)數(shù),在多線程環(huán)境中,Rc 無法安全地使用,因?yàn)樗囊糜?jì)數(shù)無法保證并發(fā)安全。Arc 提供了高效而安全的共享所有權(quán)機(jī)制,通過使用原子變量來保證線程安全。Arc 是一種非常有用的智能指針。它通過使用 clone 方法并通過原子方式增加引用計(jì)數(shù)來創(chuàng)建新的所有權(quán)證書,從而允許在多個線程中共享數(shù)據(jù)。
use std::sync::Arc;
use std::thread;
fn main() {
let data = Arc::new(vec![1, 2, 3, 4, 5]);
let handle = thread::spawn(move || {
//克隆了一份到線程內(nèi)部
let local_data = data.clone();
println!("local_data: {:?}", local_data);
});
handle.join().unwrap();
}
Cell 智能指針
Rust 中的 Cell 類型是一個原子可變?nèi)萜?,它允許我們持有一個不可變對象,并提供了對其中一個字段進(jìn)行可變訪問的能力。它常被用于資源共享或狀態(tài)修改的小場景中。
use std::cell::Cell;
struct Point {
x: i32,
y: Cell<i32>,
}
fn main() {
let point = Point { x: 5, y: Cell::new(10) };
let old_y = point.y.get();
point.y.set(20);
let new_y = point.y.get();
println!("Old y was {}, new y is {}", old_y, new_y);
}
RefCell 智能指針
Rust 中的 RefCell 類型是一個智能指針,它提供了內(nèi)部可變性(mutability),允許我們在不可變引用之間修改值。但是,與 Cell 不同的是,RefCell 會在運(yùn)行時進(jìn)行借用檢查來保證數(shù)據(jù)的安全性。
主要在以下兩種情況下使用 RefCell:
-
當(dāng)你需要在不可變引用之間修改值時;
-
當(dāng)你不能使用 Rc,但仍需要共享所有權(quán)的時候。文章來源:http://www.zghlxwxcb.cn/news/detail-463984.html
use std::cell::RefCell;
fn main() {
//RefCell提供內(nèi)部可變性
let cell = RefCell::new(10);
{
// 運(yùn)行時會檢查借用規(guī)則,所以這里必須加大括號
// 將可寫借用跟后面的只讀借用隔離開來
let mut mut_ref = cell.borrow_mut();
*mut_ref += 1;
}
println!("{}", cell.borrow()); //11
}
RefCell相比Cell,內(nèi)部維護(hù)了一個包裝對象的引用計(jì)數(shù),當(dāng)通過 RefCell.borrow 獲取一個共享引用時,內(nèi)部引用計(jì)數(shù)加一,當(dāng)獲取的引用離開作用域時,內(nèi)部引用計(jì)數(shù)減一,當(dāng)RefCell.borrow_mut 獲取一個可變引用時,首先檢測引用計(jì)數(shù)是否為 0,如果為 0,正常返回,如果不為 0,直接 panic,其實(shí) RefCell.borrow 時也會做類似的檢測,當(dāng)已經(jīng)獲取了可變引用也是直接 panic, 當(dāng)然為了避免 panic,可以用 RefCell.try_borrow 和 RefCell.try_borrow_mut 來獲取一個 Result 類型。文章來源地址http://www.zghlxwxcb.cn/news/detail-463984.html
到了這里,關(guān)于rust 智能指針的文章就介紹完了。如果您還想了解更多內(nèi)容,請?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!