很多人的答案喜歡從棧的功能上做解釋,什麼因為棧處理只有push/pop所以小……什麼
我感覺沒有回答到精髓上。我覺得要從常識邏輯來分析為什麼不推薦把data都放在棧上。其主要原因在我的經驗上來看是棧的LIFO (last in first out)儲存特性導致把data放在棧上會很浪費記憶體空間。
好了,我們來舉個例子,你有三個大檔案,一個單核CPU,所以你要處理檔案的時候要by一步一步來。 如果我們全部都用棧的話,我們來看一下當前棧的情況:
這個時候你弄完了Data 1, 開始弄Data 2.。。。。
等等!這樣的話 Data 1已經沒用了,存在棧裡面太浪費了。我要把它取出來!
嗯,這就是個問題。棧的規則是LIFO。所以你怎麼取出來呢?
這麼一想,是不是覺得為什麼不推薦存進棧裡面了。
那麼這時候有人可能會問,那我能不能先不全部存進記憶體裡,能不能做完1,取出1,再存2,再做2。
能是能,但是你知道一個核心,一會兒做I/O, 一會兒ALU做計算,效率不高的……
那麼這個時候又有人問,我是硬體大佬,我改了棧的模式,我可以把Data 1 從中間取出來。這樣行不行?
也行。你改了棧的儲存取出的方法,那麼你還不能只改取出的方案,儲存的方案是不是也要改,你要同意棧不再是堆疊儲存(意思如果你想加Data 4的話,不再只能加在Data 3 下面,看圖)而是同意Data 4可以填補Data 1的空隙來省空間。
那麼恭喜你,這個改進後的“棧”其實就是“堆”的雛形了……
很多人的答案喜歡從棧的功能上做解釋,什麼因為棧處理只有push/pop所以小……什麼
棧只是的名詞,我們的關注點是它的功能,棧的功能主要是函式呼叫、區域性變數申請、函式引數傳遞所使用的空間,是為函式呼叫的實現提供一些儲存、恢復操作。我感覺沒有回答到精髓上。我覺得要從常識邏輯來分析為什麼不推薦把data都放在棧上。其主要原因在我的經驗上來看是棧的LIFO (last in first out)儲存特性導致把data放在棧上會很浪費記憶體空間。
好了,我們來舉個例子,你有三個大檔案,一個單核CPU,所以你要處理檔案的時候要by一步一步來。 如果我們全部都用棧的話,我們來看一下當前棧的情況:
這個時候你弄完了Data 1, 開始弄Data 2.。。。。
等等!這樣的話 Data 1已經沒用了,存在棧裡面太浪費了。我要把它取出來!
嗯,這就是個問題。棧的規則是LIFO。所以你怎麼取出來呢?
這麼一想,是不是覺得為什麼不推薦存進棧裡面了。
那麼這時候有人可能會問,那我能不能先不全部存進記憶體裡,能不能做完1,取出1,再存2,再做2。
能是能,但是你知道一個核心,一會兒做I/O, 一會兒ALU做計算,效率不高的……
那麼這個時候又有人問,我是硬體大佬,我改了棧的模式,我可以把Data 1 從中間取出來。這樣行不行?
也行。你改了棧的儲存取出的方法,那麼你還不能只改取出的方案,儲存的方案是不是也要改,你要同意棧不再是堆疊儲存(意思如果你想加Data 4的話,不再只能加在Data 3 下面,看圖)而是同意Data 4可以填補Data 1的空隙來省空間。
那麼恭喜你,這個改進後的“棧”其實就是“堆”的雛形了……