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 記憶體模型 1 棧區 由編譯器自動分配和釋放,存放函式的引數數值,區域性變數的值 其操作方式類似於資料結構中的棧 2 堆區 一般由使用者分配和釋放,若使用者不釋放,程式結束時候由os 它與資料結構...
堆分配 棧分配
棧的分配是編譯時刻決定的,所以用棧只能申請固定大小的記憶體,比如靜態陣列或者結構體。函式中的區域性變數是用棧來實現的,函式結束後,棧頂的部分資料被破壞。棧空間的大小可以在編譯前制定,vc中預設值為4m.函式每次呼叫,都會使用棧空間,故函式呼叫的層次太深,函式同時指定的陣列總容量太大。或者遞迴程式 呼...
記憶體分配 堆和棧的區別
1 資料結構的棧和堆 堆疊,實際上堆疊是兩種資料結構 堆和棧。堆和棧都是把一些資料項按序排列的資料結構。2 記憶體分配中的棧和堆 這裡有必要把記憶體分配 一般情況下程式存放在rom或flash中,執行時需要拷到記憶體中執行,記憶體會分別儲存不同的資訊,如下圖 資料在記憶體中的儲存圖示 所示 0xc0...