檢查程式記憶體

程式分配記憶體的方式有兩種:

  • 堆疊 (Stack):本機變數的連續記憶體區域。

    • 值在編譯期間具有已知的固定大小。
    • 相當快速:只需移動堆疊指標。
    • 易於管理:追蹤函式呼叫。
    • 良好的記憶體區域性。
  • 堆積 (Heap):函式呼叫外的值儲存空間。

    • 值在執行階段中以動態方式判斷大小。
    • 速度稍慢於堆疊:需要作一些記錄。
    • 不保證記憶體區域性。

範例

Creating a String puts fixed-sized metadata on the stack and dynamically sized data, the actual string, on the heap:

fn main() {
    let s1 = String::from("Hello");
}
StackHeaps1capacity5ptrHellolen5
This slide should take about 5 minutes.
  • 請說明 String 是由 Vec 支援,因此具有容量和長度,而且還能成長 (前提是可透過堆積上的重新配置作業進行變動)。

  • 如有學員問起,您可以說明基礎記憶體是使用[系統配置器]配置的堆積,而自訂配置器可以使用[配置器 API] 實作。

探索更多內容

We can inspect the memory layout with unsafe Rust. However, you should point out that this is rightfully 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}");
    }
}