1. 程式人生 > >c++ 堆和棧的區別(又一篇)

c++ 堆和棧的區別(又一篇)

轉自: https://bbs.csdn.net/topics/390292159   使用者 baichi4141

 

棧記憶體的效率的確是最高的,因為棧並不是一次次的分配記憶體,而是初始分配整個記憶體,每次壓棧的時候只是單純的移動棧指標而已
但棧的優點和缺點是一體的,都源於它的概念“先進後出”。簡單地說,你先壓棧一萬字節,再壓棧五個位元組,在這五個位元組被彈出棧之前,那一萬個位元組必須一直放在棧內——哪怕這五個位元組你要使用一年,而那一萬個位元組你只使用一毫秒

堆記憶體的效率略低,主要是因為堆是隨機訪問,這裡的隨機,意為“每一塊記憶體都和另一塊記憶體沒有先後關係”。申請堆記憶體的效率可能不比棧記憶體低多少,但釋放堆記憶體的時候,釋放的記憶體可能需要和旁邊的未使用記憶體重新連成一個整體,以供下一次分配,因此釋放堆記憶體的效率可能會較低,這是為了下一次申請時更快而必須付出的代價。

作業系統對棧的限制這我不瞭解,我只知道在編譯器設定裡可以限定棧的最大大小,例如VS裡預設是1M大小
如果你需要更大的空間,可以自己在堆中申請,自己實現一個棧,而不是使用預設的棧記憶體,預設的棧記憶體主要用於流程控制,例如函式傳參和臨時變數儲存等等,不需要太大。太大的棧記憶體可能會導致空間效率和時間效率的大大降低,如果你需要使用太大的棧記憶體,一般認為是你程式設計有問題

 

我覺得我說的很明白了,你是看不懂還是根本就不看?
棧的缺點在於“初始申請全部記憶體,所有資料先進後出”,例如你按照使用邏輯定義下列物件:一個整數,一塊記憶體,一個整數,一塊記憶體,那麼在第二個整數退出使用之前,第一塊記憶體就必須留在棧裡面,無關你用不用它。結果就是,第一塊記憶體就算浪費了。
堆的優點,就在於各塊記憶體之間的無關性。棧的缺點,就在於各塊記憶體是相關的。記憶體都是一樣的,兩種使用方法決定了它們各自的特點和效能。要按你想的“全部搞成棧”,那記憶體的使用效率將大大降低,因為絕大多數時間內,只有棧頂附近的那點資料被使用,而時間效率也會大大降低,因為要管理全部記憶體,記憶體之間的資料操作也要跨越太長地址,等等等等。
最簡單的例子,所有記憶體長度不定的資料型別,它們擴充套件長度的方法都是“申請更大的空間,把現有資料複製過去,刪除現有空間”。如果只有棧記憶體沒有堆記憶體,那麼每次擴充套件長度,都會直接導致原來的空間被浪費。
這還只是一個簡單的例子,在任何複雜的系統裡,都難以保證“每個變數必定在另一個特定的變數之前被刪除,這些關係構成一個固定的序列”。不能保證這一點,這些變數所佔用的記憶體空間就全部不能釋放,後果——任何一個大一些複雜一些的系統,都會導致記憶體被迅速耗盡,最終系統崩潰。