1. 程式人生 > 其它 >C++學習隨筆

C++學習隨筆

1. 程式編譯過程

  • 編譯預處理:處理以#開頭的指令;
  • 編譯優化:將原始碼的.cpp檔案翻譯成.s彙編程式碼;
  • 彙編:將彙編程式碼.s翻譯成機器指令.o檔案;
  • 連結:將一個或多個庫和目標檔案連結到一塊,生成可執行程式。

連結分為兩種:

  • 靜態連結:程式碼從其所在的靜態連結庫中拷貝到最終的可執行程式,在該程式被執行時,這些程式碼會被裝入到該程序的虛擬地址空間中。
  • 動態連結:程式碼被放到動態連結庫或共享物件的某個目標檔案中,連結程式只是在最終的可執行程式中記錄了共享物件的名字等一些資訊。在程式執行時,動態連結庫的全部內容會被對映到執行時相應進行的虛擬地址的空間。

兩種連結的優缺點:

  • 靜態連結:浪費空間,更新困難 優點是執行的時候執行速度快;
  • 動態連結:相比靜態連結會有一定的效能損失 優點是節省空間、更新方便;

2. 記憶體管理

C++ 記憶體分割槽:棧、堆、全域性/靜態儲存區、常量儲存區、程式碼區。

  • 棧:存放函式的區域性變數、函式引數、返回地址等,由編譯器自動分配和釋放
  • 堆:動態申請的記憶體空間,就是由malloc分配的記憶體塊,由程式設計師控制它的分配和釋放,如果程式執行結束還沒有釋放,作業系統會自動回收
  • 全域性區/靜態儲存區:存放全域性變數和靜態變數,程式執行結束作業系統自動釋放
  • 常量儲存區(.data 段):存放的是常量,不允許修改,程式執行結束自動釋放
  • 程式碼區(.text 段):存放程式碼,不允許修改,但可以執行。編譯後的二進位制檔案存放在這裡。

3.棧和堆的區別

  • 申請方式:棧是系統自動分配,堆是程式設計師主動申請。
  • 申請後系統響應:分配棧空間,如果剩餘空間大於申請空間則分配成功,否則分配失敗棧溢位;申請堆空間,堆在記憶體中呈現的方式類似於連結串列(空閒記憶體對映表),在連結串列上尋找第一個大於申請空間的節點分配給程式,將該節點從連結串列中刪除,大多數系統中該塊空間的首地址存放的是本次分配空間的大小,便於釋放,將該塊空間上的剩餘空間再次連線在空閒連結串列上。
  • 棧在記憶體中是連續的一塊空間(向低地址擴充套件) 最大容量是系統預定好的,堆在記憶體中的空間(向高地址擴充套件)是不連續的
  • 申請效率:棧是有系統自動分配,申請效率高,但程式設計師無法控制;堆是由程式設計師主動申請,效率低,使用起來方便但是容易產生碎片。
  • 存放的內容:棧中存放的是區域性變數,函式的引數;堆中存放的內容由程式設計師控制。

4.變數的區別

變數的四大型別:全域性變數,靜態全域性變數,區域性變數,靜態區域性變數。
全域性變數:全域性作用域,一個檔案中定義,同屬於一個程式的其他檔案之中使用extern聲明後也可使用。
靜態全域性變數:檔案作用域不同檔案之間不共享。
區域性變數:區域性作用域函式體執行完被銷燬,存放在棧區。
靜態區域性變數:區域性作用域程式執行結束後被銷燬

除了區域性變數存放在棧區外,其他變數全都存在靜態儲存區。
作用域可分為 6 種:全域性,區域性,語句,類,名稱空間和檔案。