C++算法工程師考點總結

1、源程序是如何被編譯成可執行的二進制程序的

在這裏插入圖片描述
預處理: 在程序編譯之前,由預處理器對C++源程序完成預處理工作。預處理主要將源程序中的宏定義指令、條件編譯指令、頭文件包含指令以及特殊符號完成相應的替換工作。(該步驟不進行語法檢查,這就是inline函數比宏定義安全的原因)
編譯器: 以預編譯的輸出作爲輸入,利用C++運行庫,通過詞法分析和語法分析,在確認所有的指令都符合語法規則時,將其翻譯成等價的中間代碼表示或是彙編語言(.s 文本文件)
彙編器: 將以彙編語言的形式存在的程序轉化爲機器可識別的二進制代碼(.o 二進制文件)
鏈接器: 經過彙編器之後的目標文件仍然是不可執行的,因爲缺乏程序運行必須的動態鏈接庫(.dll)和靜態鏈接庫(.lib),鏈接器就是將程序所引用的外部文件關聯起來,形成 .exe 後綴的可執行文件。

2、動態鏈接庫和靜態鏈接庫

靜態鏈接庫和動態鏈接庫都是共享代碼的方式。
靜態鏈接庫:
如果採用靜態鏈接庫,則無論你願不願意,lib中的指令都全部被直接包含在最終生成的EXE文件中。
靜態鏈接庫中不能包含其他的靜態鏈接庫或者動態鏈接庫。
動態鏈接庫:
若使用動態鏈接庫,該DLL不必被包含在最終的EXE文件中,EXE文件執行時,可以“動態地”引用和卸載這個與EXE獨立的DLL文件。
動態鏈接庫中可以繼續包含其他的靜態鏈接庫或者動態鏈接庫。

3、C/C++程序的內存分配情況

由C/C++編譯的程序佔用的內存分爲以下幾個部分:

  1. 棧區(stack):由編譯器自動分配釋放,存放的是函數的局部變量、函數參數、返回數據、返回地址等。當函數執行完畢之後自動釋放。其操作方式類似於數據結構中的棧。
  2. 堆區(heap):一般由程序員分配釋放,若程序員不釋放,程序結束後由OS負責回收。分配方式類似於鏈表。
  3. 全局區(靜態區static):存放全局變量、靜態數據、常量。程序結束後由系統釋放。
  4. 文字常量區:常量字符串存儲的區域。程序結束後由系統釋放。
  5. 程序代碼區:存放函數體(類成員函數和全局函數)的二進制代碼。

4、new 和 malloc 的區別

  1. new/delete 是 C++ 中的操作符,malloc/free 是 C/C++ 語言的標準庫函數。
  2. new 不止是分配內存,而且會調用類的構造函數,同理 delete 會調用類的析構函數,而 malloc 則只分配內存,不會進行初始化類成員的工作,同樣 free 也不會調用析構函數。
  3. 用法不同:
    malloc返回的是(void*)類型的指針,所以需要進行強制類型轉換,如:
    int *p = (int *)malloc(sizeof(int) * length);
    new 的使用則相對比較簡單,直接可以使用:
    Obj *objects = new Obj[100];
  4. 內存泄漏時,new 和 malloc 都可以檢查出來,但是new可以指明具體是哪個文件的哪一行出現了內存泄漏。
  5. malloc 申請空間的原理:
    malloc 可以將可用的內存塊連接爲一個長長的列表,所謂空閒列表。調用malloc函數時,它沿着連接表找到一個足以滿足用戶需求的內存塊,然後將該內存塊一分爲二(一塊的大小與用戶請求的大小相等,另一塊的大小就是剩下的字節)。接下來,將分配給用戶的那塊內存塊連接傳給用戶,並將剩下的那塊返回到連接表上。調用free函數時,它將用戶釋放的內存塊連接到空閒鏈上。最後,空閒鏈會被切分成很多小的內存片段。

5、內聯函數和宏定義的差別?

  1. 內聯函數在編譯時展開,宏在預編譯時展開。
  2. 編譯器會對內聯函數的參數類型做安全檢查或自動類型轉換(同普通函數一樣),而宏定義不會。
  3. 內聯函數可以訪問類的成員變量,宏定義則不能。
  4. 在類中聲明同時定義的成員函數,自動轉化爲內聯函數(即如果類的成員函數是在類內部定義的,則不需要在函數定義之前加inline,該函數就自動轉爲inline函數)。
  5. 內聯函數是直接嵌入到目標代碼中,而宏是做簡單的文本替換。

內聯函數和普通函數相比,可以加快程序的運行速度,因爲不需要中斷調用,在編譯的時候內聯函數可以直接被嵌到目標代碼中。對於短小的代碼來說,inline可以帶來一定的效率提升,而且和宏定義相比,inline更可靠安全。但是這是以增加空間消耗爲代價的。inline一般只用於如下情況:

  1. 一個函數不斷被重複調用。
  2. 函數只有簡單的幾行,且函數不包含for、while、switch語句。

一般來說,我們寫小程序沒有必要定義成inline,但是如果是要完成一個工程項目,當一個簡單函數被調用多次時,則應該考慮用inline。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章