1. 程式人生 > >堆、棧與記憶體的問題 —— 記憶體映像

堆、棧與記憶體的問題 —— 記憶體映像

Introduction

程式在執行時要在記憶體開闢一塊區域當作棧使用,用來存放函式中的普通變數。那堆區是如何產生的,用來存放什麼東西?

Problem

程式在執行過程中如何分配記憶體,棧區、堆區對於程式的意義是什麼,如何從記憶體映像的角度理解這一切?

Solution

1、記憶體映像

程序的記憶體映像,指的是核心如何在記憶體中存放可執行程式檔案。具體地講,可執行程式檔案在執行時就成了記憶體映像,它們是對應關係。但兩者又是有區別的 —— 

  1. 位置上講,可執行程式位於硬碟,記憶體映像位於記憶體
  2. 從附屬記憶體來講,可執行程式沒有堆疊,記憶體映像被分配了堆疊
  3. 從資料上講,可執行程式是靜態的,記憶體映像是動態的

總的來說,兩者區別是執行前和執行時的區別。

2、C++程式的記憶體分佈

棧(stack) 編譯器自動分配釋放,存放函式引數、函式返回地址、普通變數
堆(heep) 由程式設計師動態分配釋放,若程式設計師不釋放,則可能在程式結束後由OS釋放
全域性區(動態區) 存放初始化的全域性變數和靜態變數,未初始化的放在相鄰的區域(BSS),程式結束後由OS釋放
常量區(資料區) 常量字串
程式碼區 存放函式體的二進位制程式碼