C++ 編譯過程

編譯器直接將源代碼轉化成彙編語言或機器指令。

C++編譯過程主要有以下幾個過程:

(1)編譯預處理   

 預處理主要包括三種:1)宏定義命令;2)條件編譯命令;3)頭文件包含命令。預處理命令以“#”開頭。編譯程序完成的工作,可以說是對源程序的“替換”工作。經過這個過程,生成一個沒有宏定義、沒有條件編譯、沒有特殊符號的輸出文件(中間文件)。

(2)編譯、優化階段     

編譯程序的工作是,通過詞法分析、語法分析,在確認所有的指令都符合語法規則之後,將其翻譯成等價的中間代碼或彙編代碼。

在生成中間代碼或彙編代碼過程中,可能涉及到優化處理。優化有兩種:一種優化僅涉及代碼本身,主要是刪除公共表達式、循環優化、代碼外提、無用代碼賦值的刪除等。另一種優化設計具體的計算機硬件

中間代碼或者彙編代碼生成以後,編譯程序將中間代碼轉換爲目標機器指令的序列,得到對應於源程序的目標文件。目標文件中存放的也就是與源程序等效的目標機器的機器語言代碼。目標文件一般至少包含2個段:代碼段和數據段。

(3)鏈接過程

將有關的目標文件彼此相連接,也即將在一個文件中引用的符號同該符號在另外一個文件中的定義連接起來,使得所有的這些目標文件成爲一個能夠誒操作系統裝入執行的統一整體。

補充鏈接類型:

靜態鏈接   

 在這種連接方式下,函數的代碼將直接拷貝到最終的可執行文件中。該程序被執行時候,會被裝入該進程的虛擬地址空間中。靜態鏈接庫實際上是一個或若干目標文件。

 動態鏈接    

這種方式下,函數的代碼被放到稱作動態連接庫或共享對象的某個目標文件中。鏈接程序此時的工作只是在生成的可執行文件中,記錄下共享對象的名字以及少量關鍵信息。動態連接庫可以被多個進程共享,在運行時候內存中只有一個實例。

二者比較    

使用動態鏈接能夠使可執行文件較小,並且當共享對象被多個進程使用時節省內存。但有時候系統運行改變或省級,不能保證動態連接庫一定可用、有效。

可參考文章:

http://www.360doc.com/content/14/0109/16/835125_343879650.shtml

發佈了65 篇原創文章 · 獲贊 39 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章