Review of Program Memory

Programs allocate memory in two ways:

  • پشته: مقادیر پشت سر هم در حافظه که برای متغییر محلی (داخل یک تابع) استفاده میشود.

    • مقادیر دارای سایز یکسان در طول کل پشته هستند که در زمان کامپایل تعیین می‌شود.
    • بسیار سریع: فقط کافیه یک اشاره‌گر را جا به جا کنیم.
    • مدیریت آسان: از فراخوانی توابع پیروی میکنند.
    • بهره‌وری عالی از حافظه
  • انباشت: حافظه از از مقادیر که خارج از جایی که فراخوانی میشود وجود دارد.

    • مقادیر سایز‌های مختلفی دارند که در زمان اجرا تعیین می‌شوند.
    • به طور محسوسی کندتر از پشته است: نیاز به یک چی-کجاست دارد.
    • هیچ تضمینی برای بهره‌وری بالا از حافظه ندارد

مثال

یک String بسازید که متادیتا با سایزثابت را روی استک قرار دهد و متن اصلی سایزپویا را در انباشت قرار دهد.

fn main() {
    let s1 = String::from("Hello");
}
StackHeaps1capacity5ptrHellolen5
This slide should take about 5 minutes.
  • اشاره کنید که یک String بر پایه Vec است، بنابراین دارای ظرفیت و طول است و می تواند در صورت قابل تغییر بودن از طریق تخصیص مجدد در انباش بزرگتر کند.

  • If students ask about it, you can mention that the underlying memory is heap allocated using the System Allocator and custom allocators can be implemented using the Allocator API

برای کاوش بیشتر

می‌توان با استفاده از unsafe در زبان راست چیدمان حافظه را بررسی کنیم. البته که به این موضوع که این کار خیلی ناایمن است هم اشاره کنید.

fn main() {
    let mut s1 = String::from("Hello");
    s1.push(' ');
    s1.push_str("world");
    // DON'T DO THIS AT HOME! For educational purposes only.
    // String provides no guarantees about its layout, so this could lead to
    // undefined behavior.
    unsafe {
        let (capacity, ptr, len): (usize, usize, usize) = std::mem::transmute(s1);
        println!("capacity = {capacity}, ptr = {ptr:#x}, len = {len}");
    }
}