記憶體的堆分配和棧分配

2021-07-11 21:19:50 字數 1505 閱讀 9918

記憶體的堆分配和棧分配

備註:這一部分非常重要,如果錯誤請及時告知。謝謝!這裡是完全參考其他部落格。

c++ 記憶體模型:

1、棧區:由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值

其操作方式類似於資料結構中的棧

2、堆區  一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os**。

它與資料結構中堆是兩回事,分配方式類似鍊錶

3、全域性區(靜態區)static 全域性變數和靜態變數的存放區域。

初始化的全域性變數和靜態變數在一塊區域  即:data區

未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。即:bbs區

程式結束後由系統釋放    (屬於堆區)

4、文字常量區  常量字串就是放在這裡的。程式結束後由系統釋放。coment區    (屬於堆區)

5、程式**區,存放函式體的二進位制**。 code區

堆和棧的理解

stack:

由系統自動分配。只要棧的剩餘空間大於所申請的空間,系統將為程式提供記憶體,否則將異常提示棧溢位。

windows 下,棧是向低位址擴充套件的資料結構,是一塊連續的記憶體區域。這句話的意思是棧頂的位址和棧的最大容量是系統預先規定好的。

在windows下,棧的大小是2m(不知道是否正確) 總之是乙個編譯時就確定的常數。如果申請的空間超過棧的剩餘空間,將提示overflow。

棧由系統自動分配,速度快。但使用者無法控制的。

heap:

需要使用者自己申請。在c中malloc函式 char *p1=(char*)malloc(10);c++ 中用new操作符。但是指標本身是在棧中

首先應該知道作業系統有乙個記錄空閒記憶體位址的鍊錶,當系統收到程式的申請時,會遍歷該鍊錶。尋找第乙個空間大於所

申請的空間的堆節點,然後將該節點從空閒節點鍊錶中刪除,並將該節點的空間分配給程式。另外,對於大多數系統,會在這塊記憶體

空間中的首位址的首位址處記錄本次分配的大小。這樣,**中的detele語句才能正確的釋放記憶體空間。另外,由於找到的堆節點的大小

不一定正好等於申請的的大小,系統會自動的將多餘的部分重新空閒鍊錶中。

堆是是向高位址擴充套件的資料結構,是不連續的記憶體區域。這是因為系統是用鍊錶來儲存的空閒記憶體位址,自然不是連續的。而鍊錶的遍歷方向是由低向高位址。堆的大小受限於計算機系統中的有效的虛擬記憶體。

堆是由 new 分配的記憶體,一般速度比較慢,而且容易產生記憶體碎片,不過用起來最方便。

參考:學習技術不只是為養家餬口,也為夜深人靜的時候能夠乙個人靜靜享受這其中的樂趣。

分類: c++破冰之旅

記憶體的堆分配和棧分配

c 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中得棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構中堆是兩回事,分配方式類似鍊錶 3 全域性區 靜態區 static 全域性變數和靜態變數的存放區域。...

堆分配 棧分配

棧的分配是編譯時刻決定的,所以用棧只能申請固定大小的記憶體,比如靜態陣列或者結構體。函式中的區域性變數是用棧來實現的,函式結束後,棧頂的部分資料被破壞。棧空間的大小可以在編譯前制定,vc中預設值為4m.函式每次呼叫,都會使用棧空間,故函式呼叫的層次太深,函式同時指定的陣列總容量太大。或者遞迴程式 呼...

記憶體分配 堆和棧的區別

1 資料結構的棧和堆 堆疊,實際上堆疊是兩種資料結構 堆和棧。堆和棧都是把一些資料項按序排列的資料結構。2 記憶體分配中的棧和堆 這裡有必要把記憶體分配 一般情況下程式存放在rom或flash中,執行時需要拷到記憶體中執行,記憶體會分別儲存不同的資訊,如下圖 資料在記憶體中的儲存圖示 所示 0xc0...