對棧,堆,靜態區的認識

2021-06-19 03:56:32 字數 794 閱讀 6086

區域性變數存放在棧中,全域性變數和靜態資料存放在靜態儲存區,在二進位制**中,顯示在資料段.對於乙個程序的記憶體空間而言,可以在邏輯上分為3個部分:**區,靜態資料區和動態資料區。動態資料區一般就是堆(heap)棧(stack)。

堆和棧是兩種不同的動態資料區,棧是一種線性結構,而堆是一種鏈式結構。

棧:只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位;在windows下,棧是鄉下生長的,是一塊連續的記憶體區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的,在windows下,棧的大小是2m(也有的說是1m,總之是乙個編譯時確定的常數,棧的大小由編譯器設定),如果申請的空間超過棧的剩餘空間時,將提示overflow。

堆:首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶,尋找第乙個空間大於所申請空間的堆結點,然後將該結點從空閒結點鍊錶中刪除,並將該結點的空間分配給程式,另外,對於大多數系統,會在這塊記憶體空間中的首位址處記錄本次分配的大小,這樣,**中的delete語句才能正確的釋放本記憶體空間。另外,由於找到的堆結點的大小不一定正好等於申請的大小,系統會自動的將多餘的那部分重新放入空閒鍊錶中。

堆是向高位址擴充套件的資料結構,是不連續的記憶體區域。鍊錶的遍歷方向是由低位址向高位址。

堆的大小受限於計算機系統中有效的虛擬記憶體。由此可見,堆獲得的空間比較靈活,也比較大。棧是由系統自動分配,速度較快。但程式設計師無法控制。      堆是由new分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。

棧由編譯器自動分配釋放

堆由程式設計師分配釋放      

靜態儲存區由系統釋放

對靜態區,棧,堆的理解

對靜態區,棧,堆的理解 1 靜態區 儲存自動全域性變數和static 變數 包括static 全域性和區域性變數 靜態區的內容在總個程式的生命週期內都存在,由編譯器在編譯的時候分配。2 棧 儲存區域性變數。棧上的內容只在函式的範圍內存在,當函式執行結束,這些內容也會自動被銷毀。其特點是效率高,但空間...

棧 堆和靜態區

棧 堆和靜態區 對於程式設計師,一般來說,我們可以簡單的理解為記憶體分為三個部分 靜態區,棧,堆。很多書沒有把把堆和棧解釋清楚,導致初學者總是分不清楚。其實堆疊就是棧,而不是堆。堆的英文是heap 棧的英文是stack,也翻譯為堆疊。堆和棧都有自己的特性,這裡先不做 討論。再打個比方 一層教學樓,可...

靜態儲存區 堆區和棧區

記憶體分配有三種 靜態儲存區 堆區和棧區。他們的功能不同,對他們使用方式也就不同。靜態儲存區 內存在程式編譯的時候就已經分配好,這塊內存在程式的整個執行期間都存在。它主要存放靜態資料 全域性資料和常量。棧區 在執行函式時,函式 包括main函式 內區域性變數的儲存單元都可以在棧上建立,函式執行結束時...