اشاره گرهای هوشمند مزایای بیشتری نسبت به اشاره گرهای معمولی دارند. در اینجا همه چیزهایی است که باید در مورد اشاره گرهای هوشمند در Rust بدانید.
مدیریت حافظه یکی از نکات فروش Rust است، به خصوص که ایمنی به خطر نیفتد. سیستم مالکیت Rust به کامپایلر اجازه می دهد تا امنیت کد و رهایی از خطاهای حافظه مانند نشانگرهای آویزان و نشت حافظه را تضمین کند.
Rust همچنین اشاره گرهای هوشمندی را با فراداده و قابلیت های اضافی فراتر از اشاره گرهای سنتی ارائه می دهد. اشاره گرهای هوشمند برای مقابله با نشت حافظه مفید هستند.
اشاره گرهای هوشمند در Rust چیست؟
اشاره گرهای هوشمند یکی از انواع داده های Rust هستند که با ارائه عملکردهای اضافی مانند اپراتورهای بارگذاری شده، تخریب کننده ها و مدیریت خودکار حافظه، قابلیت های اشاره گرهای معمولی را گسترش می دهند.
Rust از ساختارها برای اجرای اشاره گرهای هوشمند استفاده می کند. بنابراین، اشاره گرهای هوشمند نیز قابلیت مالکیت دارند.
هنگامی که حافظه حاوی داده های تخصیص یافته به صورت پویا را با اشاره گرهای هوشمند پیوند می دهید، آنها به طور خودکار تخصیص داده می شوند. اشاره گرهای هوشمند عملکردی را برای کنترل طول عمر اشیاء Rust ارائه می دهند و آنها را برای جلوگیری از خطاهایی مانند عدم ارجاع اشاره گر تهی و نشت حافظه که در سایر زبان های سطح پایین مانند C و ++C محبوب هستند، مفید می کنند.
مزایای استفاده از اشاره گرهای هوشمند
در اینجا برخی از مزایای استفاده از اشاره گرهای هوشمند وجود دارد:
- مدیریت خودکار حافظه: اشاره گرهای هوشمند برخلاف مدیریت دستی حافظه با اشاره گرهای معمولی، مدیریت خودکار حافظه از جمله تخصیص و توزیع را ارائه می دهند.
- ایمنی بهبود یافته: اشاره گرهای هوشمند معنای مالکیت را اعمال می کنند و اطمینان می دهند که فقط یک مالک می تواند در هر زمان به منابع دسترسی داشته باشد و از ردیابی داده ها و اشکالات مربوط به همزمانی جلوگیری می کند.
- انعطاف پذیری: Rust چندین نشانگر هوشمند را ارائه می دهد که هر کدام مجموعه معنایی مالکیت خود را برای نوشتن کد ایمن به صورت انعطاف پذیر دارند.
- مدیریت منابع: میتوانید از اشارهگرهای هوشمند برای مدیریت منابع دیگر مانند کنترلکنندههای فایل و سوکتهای شبکه با کپسوله کردن منابع در یک اشارهگر هوشمند استفاده کنید که مدیریت چرخه عمر آنها را آسانتر میکند و اطمینان حاصل میکند که به درستی بسته شده و پس از استفاده آزاد شدهاند.
- عملکرد بهبود یافته: اشاره گرهای هوشمند با کاهش کپی و تخصیص حافظه به بهبود عملکرد کمک می کنند – کاهش ردپای حافظه ناشی از استفاده از نشانگرهای هوشمند منجر به افزایش عملکرد می شود.
اشاره گرهای هوشمند برای کاربردهای با اندازه متوسط تا بزرگ مناسب هستند، به خصوص در مواردی که مدیریت حافظه حیاتی است.
انواع اشاره گرهای هوشمند
Rust انواع مختلفی از اشاره گرهای هوشمند از جمله Box، Rc، RefCell و Mutex را ارائه می دهد.
1. اشاره گر هوشمند جعبه
اشاره گر هوشمند Box ساده ترین و رایج ترین نشانگر هوشمند Rust است. اشاره گر هوشمند Box به تخصیص مقادیر روی پشته کمک می کند و یک نشانگر جعبه ای برای دسترسی ایجاد می کند.
اشارهگر هوشمند Box برای تخصیص حافظه پویا مفید است، زمانی که باید اطمینان حاصل کنید که زمانی که نشانگرها خارج از محدوده هستند، حافظه به طور خودکار تخصیص داده میشود.
در اینجا نحوه اعلان و استفاده از نشانگر Box آورده شده است:
fn main(){
// new instance of the box smart pointer
let x = Box::new(5);
println!(x)
}
نوع Box بخشی از مقدمه Rust است، بنابراین بر خلاف سایر اشاره گرهای هوشمند، نیازی به وارد کردن نوع آن نخواهید داشت.
متغیر x یک نشانگر Box است که به مقدار 5 عدد صحیح اشاره می کند. Rust حافظه را برای مقدار روی پشته تخصیص می دهد و زمانی که متغیر خارج از محدوده باشد به طور خودکار آن را اختصاص می دهد.
2. اشاره گر هوشمند Rc
اشاره گر هوشمند Rc (شمارش مرجع) عملکردی را برای ایجاد ارزش های مالکیت مشترک فراهم می کند. نشانگرهای هوشمند Rc تعداد ارجاعها به یک مقدار را ردیابی میکنند و زمانی که آخرین مرجع خارج از محدوده باشد، مقدار را به آن اختصاص میدهند.
اشاره گر هوشمند Rc زمانی مفید است که شما نیاز به اشتراک گذاری مالکیت یک ارزش برای دسترسی در چندین بخش از برنامه خود دارید.
برای اعلام یک اشاره گر هوشمند Rc، ساختار Rc را از کتابخانه استاندارد وارد می کنید، یک اشاره گر Rc جدید را با تابع جدید اعلام می کنید و متغیر اشاره گر را با متغیر کلون کلون می کنید.
use std::rc::Rc;
fn main() {
// new instance of the RC smart pointer
let x = Rc::new(5);
let y = Rc::clone(&x);
println!("x = {}, y = {}", x, y);
}
متغیر x متغیر اشاره گر Rc است و متغیر y یک کلون با دسترسی به مقدار موجود در حافظه است. تعداد مرجع دو است، و زمانی که متغیرها خارج از محدوده هستند، مقدار از حافظه جدا می شود.
3. اشاره گر هوشمند RefCell
اشاره گر هوشمند RefCell تغییرپذیری داخلی را فراهم می کند که اجازه می دهد تا زمانی که یک مرجع قابل تغییر در هر زمان معین وجود داشته باشد، ارجاعات تغییرناپذیر و قابل تغییر همزیستی داشته باشند.
اشاره گر هوشمند RefCell هنگام جهش دادن مقادیر متعلق به مراجع قابل تغییر مفید است.
تابع Refcell بخشی از مقدمه Rust نیست، بنابراین برای استفاده از اشاره گر هوشمند باید ساختار را از کتابخانه استاندارد وارد کنید.
use std::cell::RefCell;
fn main(){
// new instance of the Refcell smart pointer
let x = RefCell::new(5);
let y = x.borrow();
let z = x.borrow_mut();
println!("y = {}", *y);
println!("z = {}", *z);
}
اشاره گر هوشمند Refcell حاوی مقدار است و متغیر y مرجع تغییرناپذیر مقدار است. تابع borrow_mut یک مرجع قابل تغییر از مقدار ایجاد می کند.
اگر هر بار فقط یک مرجع قابل تغییر وجود داشته باشد، برنامه ایمن است.
4. اشاره گر هوشمند Mutex
اشاره گر هوشمند Mutex استثناهای متقابل را فراهم می کند. اشاره گر هوشمند Mutex برای همگام سازی دسترسی به مقادیر در چندین رشته در برنامه های همزمان مفید است.
اشاره گر هوشمند Mutex برای اطمینان از اینکه تنها یک رشته می تواند به مقدار دسترسی داشته باشد، در عین حال از ردیابی داده ها جلوگیری می کند، استثناء متقابل را فراهم می کند.
برای استفاده از Mutex Smart Pointer در Rust باید ساختار Mutex را وارد کنید و یک نمونه جدید با عملکرد جدید ایجاد کنید.
use std::sync::Mutex;
fn main() {
// new instance of the mutex pointer
let counter = Mutex::new(0);
{
let mut num = counter.lock().unwrap();
*num += 1;
}
println!("Result: {}", *counter.lock().unwrap());
}
متغیر شمارنده نمونه جدید Mutex است. تابع اصلی با روش قفل نمونه Mutex یک قفل در mutex به دست می آورد. قفل قبل از آزاد کردن قفل و چاپ مقدار، امکان تغییر ایمن مقدار شمارنده را فراهم می کند.
نوع Mutex تضمین می کند که تنها یک رشته می تواند به منابع مشترک (در این مورد، متغیر شمارنده) دسترسی داشته باشد و مقدار آن را در یک زمان تغییر دهد. طرد متقابل تضمین می کند که دسترسی همزمان به منابع مشترک سریالی شده است تا از ردیابی داده ها و سایر مسائل همزمانی جلوگیری شود.
مدل مالکیت Rust ایمنی حافظه را تضمین می کند
اشاره گرهای هوشمند یکی از رویکردهای Rust برای ایمنی و انعطاف پذیری حافظه هستند. مدل مالکیت Rust تضمین میکند که برنامهها در زمان کامپایل بهطور ایمن از حافظه با جستجوگر قرض استفاده میکنند.
چک کننده قرض یکی از ویژگی های مهم مدل مالکیت Rust است که قوانین سختگیرانه ای را برای دسترسی و اصلاح حافظه اعمال می کند.