Templates的編譯和鏈接

    對於程序員而言C++ templates可說是十分容易設計與使用的,但對於編譯器和鏈接器而言卻是一大挑戰。編譯器遇到一個 template時,不能夠立刻爲他產生機器代碼,他必須等待,知道template被指定爲某種類型。從程序員的觀點來看,這意味着template function或template class的完整定義將出現在template被使用的每一個角落,否則,編譯器就沒有足夠的信息可以幫助產生目的代碼。當多個源文件使用同一個template時,事情更趨複雜。

    每一個使用template的程序代碼的目的文件中都存在有template代碼,鏈接器負責複製和刪除


    假設有一個程序,包含兩個源文件A.CPP和B.CPP,以及一個THREE.H(其內定義了一個template類,名爲CThree)。A.CPP和B.CPP都載入THREE.H。如果A.CPP以int和double使用這個template類,編譯器將在A.OBJ中產生int和double兩種版本的template類可執行代碼。如果B.CPP以int和float使用這個template類,編譯器將在B.OBJ中產生int和float兩種版本的template類的可執行代碼。即使A.OBJ中已經有一個int版了,編譯器卻沒有辦法知道


   但這不要緊,因爲在鏈接過程中,所有重複的部分將被刪除。

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