حافظه و عملکرد سطح پایین در Rust

ایجاد شده توسط دکتر مصطفی جلیلی در آموزش برنامه نویسی Rust 17 ژوئن 2025
اشتراک گذاری

حافظه و عملکرد سطح پایین در Rust


Rust به‌عنوان یک زبان سیستمی، ابزارهای قدرتمندی برای مدیریت مستقیم حافظه و ارتباط با کدهای سطح پایین فراهم می‌کند. در این بخش با اشاره‌گرهای هوشمند (Smart Pointers)، کدهای unsafe و اتصال به زبان‌های C/C++ (FFI) آشنا می‌شویم.

Smart Pointers: Box, Rc, RefCell


Rust به‌جای اشاره‌گرهای خام، اشاره‌گرهای هوشمند (Smart Pointers) ارائه می‌دهد که مدیریت ایمن و منعطف حافظه را ممکن می‌کنند.


Box

- برای ذخیره داده‌ها در heap استفاده می‌شود.

- سایز نوع‌های بازگشتی یا داده‌های بزرگ را کنترل می‌کند.


let b = Box::new(10);
println!("Box contains: {}", b);

Box داده را در heap قرار می‌دهد اما مالکیت را همچنان به‌صورت ایمن مدیریت می‌کند.


Rc

مرجع‌شمار (Reference Counted) برای اشتراک‌گذاری داده‌ها بین چند مالک.

- فقط برای داده‌های خواندنی (immutable) مناسب است.


use std::rc::Rc;
let a = Rc::new(5);
let b = Rc::clone(&a);
println!("a: {}, b: {}", a, b);

RefCell

- اجازه می‌دهد قوانین وام‌گیری (borrow rules) در زمان اجرا بررسی شوند، نه زمان کامپایل.


امکان ایجاد قابلیت تغییر interior mutability را می‌دهد.


use std::cell::RefCell;
let data = RefCell::new(10);
*data.borrow_mut() += 5;
println!("data: {:?}", data.borrow());

 Unsafe Rust و کد غیر ایمن


Rust به‌طور پیش‌فرض ایمنی حافظه را تضمین می‌کند، اما گاهی نیاز به کارهای سطح پایین داریم (مثل کار با اشاره‌گر خام یا ارتباط با کدهای C).


کد unsafe امکان:

- دسترسی به اشاره‌گر خام

- فراخوانی توابع unsafe

- تغییر داده‌های immutable

- فراخوانی کد C


را می‌دهد.


مثال:


let x: i32 = 10;
let r: *const i32 = &x;

unsafe {
println!("مقدار x از طریق اشاره‌گر: {}", *r);
}

در بلاک unsafe، مسئولیت ایمنی با برنامه‌نویس است.


FFI: اتصال به کدهای C/C++


Rust به‌راحتی می‌تواند با کدهای C (و با کمی کار اضافی، C++) ارتباط برقرار کند. این ویژگی برای نوشتن درایورها، کتابخانه‌های سیستمی یا استفاده از کتابخانه‌های موجود ضروری است.


تعریف تابع C:


فرض کنید یک تابع C دارید:


// example.c
int add(int a, int b) {
return a + b;
}

در Rust:


extern "C" {
fn add(a: i32, b: i32) -> i32;
}
fn main() {
unsafe {
let sum = add(3, 4);
println!("نتیجه: {}", sum);
}
}

برای استفاده از این کد باید در زمان build لینک به کتابخانه C انجام شود.


جمع‌بندی


در این بخش یاد گرفتیم:

- چطور با Smart Pointers مانند Box, Rc, و RefCell حافظه را به‌صورت ایمن و منعطف مدیریت کنیم.

- چگونه از unsafe Rust برای دسترسی سطح پایین و کار با اشاره‌گرهای خام استفاده کنیم.

- و چطور با استفاده از FFI کدهای Rust را به کتابخانه‌های C/C++ متصل کنیم.


در ادامه به مباحث هم‌زمانی و async در Rust خواهیم پرداخت.

نظرات (0)

اشتراک گذاری

این پست را با دیگران به اشتراک بگذارید

تنظیمات GDPR

When you visit any of our websites, it may store or retrieve information on your browser, mostly in the form of cookies. This information might be about you, your preferences or your device and is mostly used to make the site work as you expect it to. The information does not usually directly identify you, but it can give you a more personalized web experience. Because we respect your right to privacy, you can choose not to allow some types of cookies. Click on the different category headings to find out more and manage your preferences. Please note, that blocking some types of cookies may impact your experience of the site and the services we are able to offer.