檢查程式記憶體
程式分配記憶體的方式有兩種:
-
堆疊 (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"); }
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}"); } }