1. 程式人生 > >堆和棧的大小分析

堆和棧的大小分析

1、俗話說:一個程序一個堆,一個執行緒一個棧。也就是說棧是跟執行緒相關的,堆是跟程序相關。

2、棧在win32平臺下預設1MB預留空間, 初次遞交8KB,自動增長,具體使用要看執行緒呼叫棧的方式。所以如果程序中有N個執行緒,預設情況下有N*1MB的棧預留空間和小於這個數字的實際使用空間。

3、堆和Heap管理有關,預設存在系統堆和CRT堆。具體大小取決於程式本身對記憶體的分配和使用,可以呼叫HeapSize看實際使用大小,理論上說一個系統的虛擬記憶體有多大,堆的大小就有多大。另外還有虛擬記憶體,獨立於堆外,直接通過VirtualAlloc預留或分配,也屬於程序動態分配的記憶體。

4、棧大小固定(編譯時確定),堆的大小實際上(執行時)動態變化的。棧的大小在編譯器選項中可以設定,比如VS的專案屬性-C++-命令列,在附加選項中可以設定。

1、棧是為了執行緒的執行而服務的。每當一個函式被呼叫時,棧頂的一個block保留用於區域性變數和程式資料。函式返回時,這個block被釋放以便下一次函式呼叫時使用。棧採用LIFO的順序來儲存,最經常被保留的block往往是下一個被釋放的block。這使得跟蹤一個block的使用變得很簡單。

2、堆用於動態記憶體分配,對於它的block沒有固定的分配和釋放方式,所以可以隨時隨地釋放和分配一個堆上的block。這也使得我們很難跟蹤到堆上的一個block的使用情況,對於不用的使用模式來說,有很多典型的allocators來調整堆的效能。

3、棧要時刻考慮溢位的問題,分配速度快,類似於資料結構中的stack;堆幾乎不用考慮不夠的問題,除非特別的記憶體申請,分配速度慢,類似於資料結構中linked-list。

blablabla。。。

一張圖說明: