請描述C/C++程式的記憶體分割槽?

lingshengxueyuan發表於2020-03-13

在這裡插入圖片描述
其實C和C++的記憶體分割槽還是有一定區別的,但此處不作區分:
1)、棧區(stack)— 由編譯器自動分配釋放 ,存放函式的引數值,區域性變數的值等。其
操作方式類似於資料結構中的棧。
2)、堆區(heap) — 一般由程式設計師分配釋放, 若程式設計師不釋放,程式結束時可能由OS回
收 。注意它與資料結構中的堆是兩回事,分配方式倒是類似於連結串列。
3)、全域性區(靜態區)(static)—,全域性變數和靜態變數的儲存是放在一塊的,初始化的
全域性變數和靜態變數在一塊區域, 未初始化的全域性變數和未初始化的靜態變數在相鄰的另
一塊區域。 - 程式結束後由系統釋放。
4)、文字常量區 —常量字串就是放在這裡的。 程式結束後由系統釋放。
5)、程式程式碼區—存放函式體的二進位制程式碼。

棧區與堆區的區別:
1)堆和棧中的儲存內容:棧存區域性變數、函式引數等。堆儲存使用new、malloc申請的變數等;
2)申請方式:棧記憶體由系統分配,堆記憶體由自己申請;
3)申請後系統的響應:棧——只要棧的剩餘空間大於所申請空間,系統將為程式提供記憶體,否則將報異常提示棧溢位。
堆——首先應該知道作業系統有一個記錄空閒記憶體地址的連結串列,當系統收到程式的申請時,會遍歷該連結串列,尋找第一個空間大於所申請空間的堆結點,然後將該結點從空閒結點連結串列 中刪除,並將該結點的空間分配給程式;
4)申請大小的限制:Windows下棧的大小一般是2M,堆的容量較大;
5)申請效率的比較:棧由系統自動分配,速度較快。堆使用new、malloc等分配,較慢;
總結:棧區優勢在處理效率,堆區優勢在於靈活;
記憶體模型:自由區、靜態區、動態區;
根據c/c++物件生命週期不同,c/c++的記憶體模型有三種不同的記憶體區域,即:自由儲存區,動態區、靜態區。
自由儲存區:區域性非靜態變數的儲存區域,即平常所說的棧;
動態區: 用new ,malloc分配的記憶體,即平常所說的堆;
靜態區:全域性變數,靜態變數,字串常量存在的位置;
注:程式碼雖然佔記憶體,但不屬於c/c++記憶體模型的一部分;

2020年更多、更全、更新大廠面試資料,歡迎+群學習交流,個人簡介資訊加群領取
在這裡插入圖片描述

相關文章