沒錯哦,從題目可以看出本章是講述編譯器構建class的方法。
作為c++核心基礎之一的class,了解編譯器背後為其做了哪些,是認識c++底層實現機制的關鍵,同時我看到,很多人在各類文章的只言片語中,對其進行了大量的充滿迷信和傳說的詮釋。
要講class,就不得不說說struct,因為編譯器在構建它們的資料成員的方法上是相似的。這也是我最想讓你知道的,即「通過類封裝資料和操作本身是絕對沒有額外成本的,效率和空間的犧牲大部分在於虛表的維護」
回到正題,我們實際上可以認為struct是乙個資料宣告集合,對於struct來說資料分為兩類:static data members和non-static data members。如果是non-static型別,當時構建struct object時,就將其配置在struct object之內,而static型別的則放在struct之外,即儲存在程式的靜態儲存區。
舉例來說:(
抱歉虛表位置畫錯了,實際應在最頂端)
現在來講class,對於class來說,它不但有資料成員(data members),還有函式成員(function members),上文我說過class的資料成員構建方法和struct是一樣的,所以我們只說說函式成員,它分為三種:static、non-static和virtual,其中static和non-static宣告與資料成員類似,若是non-static的函式成員則在class object內記錄乙個函式指標,函式體放在classobject之外,static的則直接放在靜態儲存區。
那麼唯一特殊的就是virtual型別的函式成員,它通過在每乙個class object尾部新增乙個vptr指標,指向虛表(virtual table),該錶維護繼承、過載、執行時型別識別等功能。class的效率和空間犧牲基本都在這裡。
舉例:
通過上文我們可以看出,通過類來封裝和操作本身並不會增加額外開銷,真正的負擔在於由於虛表,class object的結構可以理解為
class object=(類似struct object結構的data members)+
(類似data members的function members指標記錄集合)+
(vptr虛表指標);
編譯器實現(六)
語義分析可以分為兩類。第1類是程式的分析,要求根據程式語言的規則建立其正確性,並保證其正確執行。對於不同的語言來說,語言定義所要求的這一類分析的總量變化很大。在lisp和smalltalk這類動態制導的語言中,可能完全沒有靜態語義分析 而在a d a這類語言中就有很強的需求,程式必須提交執行。其他的...
編譯器實現之旅 第二章 編譯器前端概觀
在這一章的旅程中,我們將要深入編譯器前端一 竟。看看編譯器前端到底由哪些元件組成,其分別又是在做什麼。似乎比我們想象的要簡單,編譯器前端僅由兩個元件組成,詞法分析器與語法分析器。請看下圖 源 詞法分析器 記號流 語法分析器 抽象語法樹 詞法分析器 lexer 是 前端中的前端 作為整個編譯器的第乙個...
編譯器預處理實現
我們寫 一般都會寫一些注釋,為了讓人更好的理解 但是對於編譯器來說,這些注釋都需要去除,為了實現預處理,就是去除注釋 換行 回車等,我用dfa 確定有限自動機 來實現。include include using namespace std define r 10 define c 8 dfa int...