請描述C/C++程式的記憶體分割槽?
其實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年更多、更全、更新大廠面試資料,歡迎+群學習交流,個人簡介資訊加群領取
相關文章
- c++之引用及記憶體分割槽模型C++記憶體模型
- 淺析JVM記憶體分割槽JVM記憶體
- [C++]記憶體分配C++記憶體
- C++記憶體管理C++記憶體
- Android 分割槽和記憶體監控Android記憶體
- 控制C++的記憶體分配C++記憶體
- C/C++程式除錯和記憶體檢測C++除錯記憶體
- 【C/C++】4.C++的記憶體管理C++記憶體
- C++記憶體管理剖析C++記憶體
- C++ 記憶體對齊C++記憶體
- c++ 記憶體 繼承C++記憶體繼承
- C++記憶體掃描C++記憶體
- C++ 程式記憶體洩漏檢測方法C++記憶體
- C++ 物件的記憶體佈局C++物件記憶體
- C++記憶體管理:簡易記憶體池的實現C++記憶體
- C++手寫記憶體池C++記憶體
- C++ 動態記憶體分配C++記憶體
- C++中“記憶體重疊”C++記憶體
- 轉載——C++記憶體管理C++記憶體
- C++動態記憶體分配C++記憶體
- C++ 共享記憶體ShellCode跨程式傳輸C++記憶體
- C/C++記憶體對齊詳解C++記憶體
- C/C++記憶體分配以及釋放C++記憶體
- C/C++記憶體對齊原則C++記憶體
- 【C++】C++ 記憶體分配(new,operator new)詳解C++記憶體
- C++學習體會:記憶體管理C++記憶體
- 【C++】 外傳篇 3_動態記憶體申請的結果C++記憶體
- java虛擬機器執行時記憶體分割槽Java虛擬機記憶體
- 從C++看C#託管記憶體與非託管記憶體C++C#記憶體
- 查詢windows記憶體卡槽及卡槽支援的最大記憶體Windows記憶體
- C++記憶體模型實踐探索C++記憶體模型
- C++ - 二級指標動態記憶體申請與釋放C++指標記憶體
- C/C++記憶體洩漏及檢測C++記憶體
- C/C++實戰之記憶體管理 (轉)C++記憶體
- C++ 繼承中的記憶體佈局C++繼承記憶體
- C++記憶體池的實現例項C++記憶體
- C/C++記憶體釋放應注意的問題C++記憶體
- C++ struct結構體記憶體對齊C++Struct結構體記憶體