1. 靜態記憶體
靜態記憶體是指在程式開始執行時由編譯器分配的記憶體,它的分配是在程式開始編譯時完成的,不占用cpu資源。
程式中的各種變數,在編譯時系統已經為其分配了所需的記憶體空間,當該變數在作用域內使用完畢時,系統會
自動釋放所占用的記憶體空間。
變數的分配與釋放,都無須程式設計師自行考慮。
eg:基本型別,陣列
2. 動態記憶體
使用者無法確定空間大小,或者空間太大,棧上無法分配時,會採用動態記憶體分配。
3. 區別
a) 靜態記憶體分配在編譯時完成,不占用cpu資源; 動態記憶體分配在執行時,分配與釋放都占用cpu資源。
b) 靜態內存在棧(stack)上分配; 動態記憶體在堆(heap)上分配。
c) 動態記憶體分配需要指標和引用型別支援,靜態不需要。
d) 靜態記憶體分配是按計畫分配,由編譯器負責; 動態記憶體分配是按需分配,由程式設計師負責。
乙個c++程式編譯後占用的記憶體分為如下幾個部分:
棧:由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。
堆:由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os**。存放由new,malloc分配的記憶體,可動態擴充套件和收縮。
全域性區(靜態區):全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和初始化的靜態變數在一塊區域;未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。
文字常量區:常量字串放在這裡,程式結束後由系統釋放。
程式**區:存放函式體的二進位制**。
從以上介紹中,它們有如下區別:
(1)棧是系統提供的功能,特點是快速高效,缺點是由限制,資料不靈活;
堆是函式庫提供的功能,特點是靈活方便,資料適應面廣,但是效率有一定降低。
(2)棧是系統資料結構,對於程序/執行緒是唯一的;
堆是函式庫內部資料結構,不一定唯一,不同堆分配的記憶體無法互相操作。
(3)棧空間分靜態分配和動態分配,一般由編譯器完成靜態分配,自動釋放,棧的動態分配是不被鼓勵的;
堆得分配總是動態的,雖然程式結束時所有的資料空間都會被釋放回系統,但是精確的申請記憶體/釋放記憶體匹配是良好程式的基本要素。
(4)碎片問題
對於堆來講,頻繁的new/delete等操作勢必會造成記憶體空間的不連續,從而造成大量的碎片,使程式的效率降低;對於棧來講,則不會存在這個問題,因為棧是後進先出(lifo)的佇列。
(5)生長方向
堆的生長方向是向上的,也就是向這記憶體位址增加的方向;對於棧來講,生長方向卻是向下的,是向著記憶體位址減少的方向增長。
(6)分配方式
堆都是動態分配的,沒有靜態分配的堆;
棧有兩種分配方式:靜態分配和動態分配。靜態分配是編譯器完成的,比如區域性變數的分配。動態分配則由alloca函式進行分配,但是棧的動態分配和堆不同,它的動態分配是由編譯器進行釋放,無需我們手工實現。
(7)分配效率
棧是機器系統提供的資料結構,計算機在底層提供支援,分配有專門的堆疊段暫存器,入棧出棧有專門的機器指令,這些都決定了棧的高效率執行。
堆是由c/c++函式庫提供的,機制比較複雜,有不同的分配演算法,易產生記憶體碎片,需要對記憶體進行各種管理,效率比棧要低很多。
C C 記憶體補齊機制
在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間 各個成員按照它們被宣告的順序在記憶體中順序儲存,第...
C C 記憶體分配機制
1.c語言中的記憶體機制 在c語言中,記憶體主要分為如下5個儲存區 1 棧 stack 位於函式內的區域性變數 包括函式實參 由編譯器負責分配釋放,函式結束,棧變數失效。2 堆 heap 由程式設計師用malloc calloc realloc分配,free釋放。如果程式設計師忘記free了,則會造...
C C 中的記憶體補齊機制
原文 在c語言中,結構是一種復合資料型別,其構成元素既可以是基本資料型別 如int long float等 的變數,也可以是一些復合資料型別 如陣列 結構 聯合等 的資料單元。在結構中,編譯器為結構的每個成員按其自然對界 alignment 條件分配空間。各個成員按照它們被宣告的順序在記憶體中順序儲...