国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > C++ > 正文

C++--編譯器工作原理

2019-11-06 08:21:59
字體:
來源:轉載
供稿:網友

編譯器:我們常用的編譯器一般有Visual Studio(Windows),Xcode(OS),GCC(Unix)等。

它們的主要功能就是把我們寫的高級代碼轉換成可執行的二進制程序。這個轉換過程主要通過預處理器,編譯器和鏈接器完成,同時它們也是可以分別設置屬性,用來控制代碼的生成方式。1,預處理器設置:如一些平臺相關的宏設置,通過控制這些宏定義,來編寫跨平臺代碼。(而且現代的預處理器,還可以直接通過命令行來定義預處理宏這與代碼中編寫#define指令等效) 2,編譯器設置:主要包括是否產生調試信息,是否展開內聯函數等一系列優化代碼的操作。3,鏈接器設置:主要是設置鏈接那些可執行文件,以及指定程序庫搜索路徑,還有一些鏈接優化方式等。

以VS為例談談編譯的具體過程:從你敲代碼,到真正運行起來,一般有預編譯,編譯,鏈接,加載,這幾步。首先是預編譯階段,主要是對c,cpp或asm等源文件進行整理,主要包括將頭文件拷貝到源文件中(#include),將代碼中的宏定義替換和條件編譯等。然后就是編譯階段,主要將整理好的源文件編譯成一個個obj文件(unix是.o文件),這時已經是二進制機器碼了,只是還沒有決定代碼內存地址。再鏈接階段,把這些obj鏈接得到exe可執行文件,這時機器碼在內存中的相對基址已經確認了。最后由操作系統加載exe,把這些可執行的二進制代碼全部加載進內存,絕對基址才最終確認,即內存地址確認。從而得到進程,即我們程序的運行。

動態鏈接庫(dll)與靜態鏈接庫(lib):(1)首先你能調用一個函數,前提就是它在內存里存在。一般的函數,編譯鏈接之后,在exe里面。操作系統加載exe的時候,分配內存,然后把函數代碼放在這塊內存,所以你就能直接調用函數了。(2)dll的話,不一樣。這是把一些代碼跟程序主體分開,編譯鏈接為dll。加載exe的時候,dll可能尚未加載,這時,你想調用的函數不在內存里。你可以手動用LoadLibrary這個函數手動加載dll,然后這個函數就在內存里了,可以取得它的地址,然后就可以調用。但一般編譯器會幫我們在使用時自動加載dll,其底層實現無非也是這么操作的(類似系統底層對main函數的調用)。因此,dll的加載其實就類似函數的調用,它能節省內存。(3)lib的話,正好相反,即把lib庫拷貝一份到exe里面,這樣與一般的編譯過程差不多了,可以脫離庫使用,類似內聯。(4)之所以使用庫,主要就是方便以后復用,節省編譯時間,因為這些庫都是已經編譯好的二進制文件。

注釋:對于c++項目理論上也是可以像腳本一樣做動態更新的,因為dll與exe主體本來就是分開的,我們可以只更新dll來實現動態更新。但是很不方便,因為exe這個主體已經不能再修改,如果dll中改了某些數據的結構,那么exe中原來的調用就不行了,除非只改了邏輯,所以要用這種就得嚴格控制統一的接口,而且以后也不能擴展。

c++自己定義好了一套準則,所有編譯器都要遵循這個規則,至于編譯器底層具體怎么去運行實現它們這個不確定,但最終的結果要遵循這個定好的標準。現在的編譯器大都也沒能全部實現c++的所有標準。所以對于一些未定義的行為,不同的編輯器就可能會有不同的表現。所以很多問題不能只死認VS,不同環境實現可能不同。

**應用程序在內存中一般分為幾塊區域: 全局數據區:存放全局數據,靜態數據等 代碼區:代碼存放區域 棧區:局部變量 堆區:動態內存**

常用輔助工具 一,檢測哪些代碼比較耗性能的剖析工具:1,Intel的VTune軟件,執行效率高但不夠詳細。2,IBM的Rational Quantify軟件,執行效率低但夠詳細。3,微軟混合了前兩種的優點,開發了名為LOP的剖析器。當然還有很多,就不一一列舉了。通過這些工具我們就可以針對性的優化代碼了。

二,檢測內存泄露工具:IBM的Purify Plus工具套裝中的Rational Purify。Purify須在程序運行前安插監控代碼,為所有指針解引用及內存分配與釋放代碼中加入掛鉤(鉤子函數)。在Purify下運行代碼,能現場報告代碼中的及時潛在問題。程序結束后,也能產生詳盡的內存泄露報告。(另一個流行工具:Compuware公司的Bounds Checker,和Purify類似)

鉤子函數:(1)百科上說,它是Windows消息處理機制的一部分,通過設置“鉤子”,應用程序可以在系統級對所有消息、事件進行過濾(即截取系統消息),訪問在正常情況下無法訪問的消息。鉤子的本質是一段用以處理系統消息的程序,通過系統調用,把它掛入系統。通俗點講就是類似一個回調函數,為某些事件設置了鉤子,只要對應事件觸發就會截取這個事件響應。總的來講,鉤子就是用來截取Windows消息,再用鉤子函數回調出去。一些外掛,木馬等就是利用它實現的。(2)舉例說明:鉤子就是,本來A調用B結果你寫一個新的函數C,強行替換掉B,A以為自己調用了B,其實調用的是C,當然C也可以再回過去調用B。比如你輸入密碼,本來這消息直接通知到控件,但是現在有人掛了鉤子,密碼就通知到他,然后他再轉發給控件。肉眼看上去一切正常,但是你的密碼已經被竊聽了。再如,通過這方法,也可以盜取游戲的圖片、模型等資源,寫一個函數,替換掉glTexImage2D。


發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表

圖片精選

主站蜘蛛池模板: 竹北市| 繁昌县| 霞浦县| 铜陵市| 江北区| 镇原县| 禹州市| 涟源市| 宜兰市| 莱阳市| 娄底市| 海原县| 乐都县| 新竹市| 福海县| 平潭县| 晋城| 南和县| 台南县| 普定县| 平顶山市| 长汀县| 马边| 乐昌市| 长海县| 云霄县| 洛阳市| 山阳县| 寿阳县| 西乌珠穆沁旗| 商水县| 台南市| 友谊县| 鲁甸县| 喀什市| 汶川县| 鄂温| 神农架林区| 阳曲县| 博乐市| 肃宁县|