C 記憶體空間

2021-08-09 22:21:33 字數 867 閱讀 2407

乙個c++程式編譯後占用的記憶體分為如下幾個部分:

:由編譯器自動分配釋放,存放函式的引數值,區域性變數的值。在乙個程序中,位於使用者虛擬位址空間頂部的是使用者棧,編譯器用它來實現函式的呼叫。

:由程式設計師分配和釋放,若程式設計師不釋放,則程式結束時被os**。存放由new,malloc分配的記憶體,可動態擴充套件和收縮。

全域性區(靜態區):全域性變數和靜態變數的儲存是放在一起的,初始化的全域性變數和初始化的靜態變數在一塊區域;未初始化的全域性變數和未初始化的靜態變數在相鄰的另一塊區域。

文字常量區:常量字串放在這裡,程式結束後由系統釋放。

程式**區:存放函式體的二進位制**。

堆和棧的主要區別

管理方式不同:棧由編譯器自動管理,無需手動控制;堆由程式設計師控制,容易產生memory leak。

能否產生碎片:對於堆來說,頻繁地new/delete勢必造成記憶體空間的不連續,從而造成大量碎片,使程式效率降低;對於棧來說,不會存在這個問題,因為棧是後進先出的佇列,一一對應,不會出現某個記憶體塊從棧中間彈出。

分配效率:棧是計算機系統提高的資料結構,作業系統在底層對棧提供支援,分配專門的暫存器存放棧的位址,壓棧出棧有專門的指令執行,這就決定了棧的效率比較高。對於堆則是由c/c++函式庫提供,顯然棧的效率比堆高。

具體程式例子

int a = 0; //全域性初始化區

char *p1; //全域性未初始化區

int main()

c 記憶體空間

題目 若char是一位元組,int是4位元組,指標型別是4位元組,如下 class ctest virtual void mem fun private char m chdata int m ndata static char s chdata char ctest s chdata 0 靜態成員...

c 記憶體空間

乙個可執行程式指令碼可以分為3個基本段,段,資料段,bss段 unix下可以使用size命令檢視可執行檔案的段大小資訊,size a.out header text 資料data bss 2 資料段.data 存放編譯階段就能確定的資料,可讀寫 3 段.text 段通常指用來存放執行d 的一塊儲存區...

C 記憶體空間分布

1.stack,即棧區,存放自動變數,以及函式呼叫時儲存的資訊。每當進行函式呼叫時,函式的實參和返回位址以及呼叫者的上下文環境會被存放在棧中 棧區由編譯器自動分配,從高位址向低位址擴充套件,為什麼會這樣?我也不知道 2.heap,即堆區,動態記憶體分配都是發生在堆區,堆區由程式設計師分配釋放,或程式...