1. 程式人生 > >C++(十八) — 記憶體模式

C++(十八) — 記憶體模式

1、記憶體模式

  一個程式執行時,先複製到記憶體,然後CPU逐句讀取指令執行。

  每個儲存單元存放一個位元組(8bit)資料,每個有一個唯一的地址,地址是順序編碼的。比如:一臺計算機256MB記憶體,則有256*1024*1024個記憶體單元,如果用7位十六進位制數表示地址值,則範圍是:0x0000000~0xFFFFFFF。

  記憶體分配:

  • (1)程式碼區:存放程式程式碼;
  • (2)全域性資料區 或 靜態變數區:全域性變數 + 靜態資料。存放長期資料的區域,從程式開始執行到結束,都會在記憶體中佔有固定的位元組;
  • (3)棧區:區域性變數。存放程式函式中的區域性變數,就是,用到某個函式時,該函式定義的變數就存在棧區,退出時相應的變數會自動釋放;還有特點:先進後出,即先進棧的變數後退出;
  • (4)堆區:動態資料,指標。在程式執行過程中申請的記憶體空間,也要在程式結束時釋放,否則記憶體洩漏;

2、變數儲存位置、作用域

(1)全域性變數

  儲存位置:全域性資料區(程式結束後由系統釋放);

  作用域:全域性作用域,只需在一個原始檔中定義,作用所有;

  週期:一直存在;

  引用方式:其他檔案使用時,用extern 關鍵字宣告。(注意:不能兩個檔案中定義相同的名字,重定義了);

(2)靜態變數

  儲存位置:全域性資料區(程式結束後由系統釋放);

  作用域:檔案作用域,在被定義的檔案中;

  週期:一直存在;

  引用方式:static, const。(檔案不相互包含

,不同檔案可定義完全相同的兩個靜態變數,是兩個完全不同的變數)

(3)區域性變數

  儲存位置:棧區。(編譯器自動分配釋放,存放函式引數值,區域性變數值);

  作用域:區域性;

  週期:程式執行出則銷燬;

  引用方式:

(4)靜態區域性變數

  儲存位置:全域性資料區;

  作用域:區域性作用域;

  週期:一直存在;

  引用方式:static。(只被初始化一次)

(5)動態資料,指標

  儲存位置:堆區;

  作用域:區域性作用域;

  週期:在程式執行中申請的記憶體空間,在程式結束中釋放;