Stack 與 Heap
這個章節跟 Rust 比較沒直接關連,比較像是計算機概論的科普時間。這個章節我們要跟大家介紹關於記憶體的 Stack 與 Heap。通常 Stack 中文會翻譯成「堆疊」,而 Heap 會翻譯成「堆積」,但我覺得中文翻譯好像沒比較容易懂,所以我們這裡就用英文原文就好。
在我學習技術的這條路上,當我想要了解一個新的名詞是什麼用途的時候,我通會先去查一下這個字本身代表的意思。根據我在牛津英語辭典(Oxford English Dictionary)上查到關於 Stack 這個字的解 釋:
Stack /stæk/
a pile of something, usually neatly arranged
Stack 用來表示一堆東西,通常會整齊排列。而 Heap 的解釋是:
Heap /hiːp/
an untidy pile of something
同樣也是表示一堆東西,但跟整齊排列的 Stack 不同,Heap 是一堆相對比較凌亂的東西。
Stack
Stack 是一連串連續的記憶體,我們可以先把它想像成這樣:
通常畫 Stack 的時候我會直著畫,像疊盤子一樣比較容易想像「先進後出(First In, Last Out)」的情境,但因為直著畫排版上篇幅會被拉長,所以我就讓這個 Stack 先躺著休息一下。
為了簡化情境,我們先假設在執行程式的之前這個 Stack 上面一開始什麼都沒有。接著我們來看一段簡單的程式碼:
fn main() {
draw(9527);
}
fn show_lotteries(n1: i32, n2: i32, n3: i32) {
println!("the lottery numbers are {} {} {}", n1, n2, n3);
}
fn draw(num: i32) {
show_lotteries(num + 1 , num + 5, num + 10);
}
上面這幾個函數不算太複雜,大概就是個簡單的抽獎程式(?)。根據各位以往在寫網頁程式的經驗,當執行到 draw(9527)
的時候,你大概猜的出來就是把 9527
這個數字傳進去。以比較高階的角度來看是這樣沒錯,但事實上程式的執行的時候,會把 9527
這個引數擺在 Stack 上,就像這樣子:
這時候的 Stack 的使用量是 1。接著,當進到 draw
函數裡繼續執行到 show_lotteries
函數的時候,它會去 Stack 上面拿最後面那格記憶體的資料來用,也就是 9527
,接著把它分別 +1、+5 及 +10 之後代入 show_lotteries
函數。同樣的概念,這時候這 3 個數值會被繼續堆到 Stack 上,看起來像這樣: