C++11 : 外部模板(Extern Template)

來源:互聯網
上載者:User

標籤:

在C++98/03語言標準中,對於原始碼中出現的每一處模板執行個體化,編譯器都需要去做執行個體化的工作;而在連結時,連結器還需要移除重複的執行個體化代碼。顯然,讓編譯器每次都去進行重複的執行個體化工作顯然是不必要的,並且連接器也因此受累。
在現實編碼世界裡,一個軟體的實現可能會在很多代碼塊中使用同一種類型去執行個體化同一個模板。此時,如果能夠讓編譯器避免此類重複的執行個體化工作,那麼可以大大提供編譯器的工作效率。因此,人們迫切需要一種手段(一種聲明方式)來告訴編譯器“該處出現的模板執行個體化工作已在其它編譯單元中完成,不再需要進行執行個體化”。
於是,一個新的語言特性————外部模板(Extern Template)————被納入到C++0x標準中。
在C++98/03中,已經有一個叫做顯示執行個體化(Explicit Instantiation)的語言特性,其目的是指示編譯器立即進行模板執行個體化操作(即強制執行個體化)。而外部模板文法就是在顯示執行個體化指令的文法基礎上進行修改得到的:通過在顯示執行個體化指令前添加首碼extern,從而得到外部模板的文法。
顯示執行個體化文法:template class vector<MyClass>;
外部模板文法:extern template class vector<MyClass>;
一旦在一個編譯單元中使用了外部模板聲明(如extern template class vector<MyClass>;),那麼編譯器在編譯該編譯單元時,會跳過與該外部模板聲明匹配的模板執行個體化(如vector<MyClass>)。
因此,在C++0x中,“模板的顯示執行個體化指令、外部模板指令和使用”可以類比為“全域變數的定義、聲明和使用”。區別僅在於,模板代表代碼,而變數代表一段連續記憶體空間。
關於外部模板文法的一些約束:
1. 如果外部模板指令出現於一個編譯單元中,那麼與之對應的顯示執行個體化必須出現於另一個編譯單元中或者同一個編譯單元的後續代碼中。
2. 外部模板指令不能用於一個靜態函數(即檔案域函數),但可以用於類靜態函數。(註:這一點是顯而易見的,因為靜態函數沒有外部串連屬性,不可能在本編譯單元之外出現)。
3. 外部模板指令應用於類的成員,而不是類本身。(註:既然已經作用於類的所有成員了,也就相當於作用於類了)
4. 外部模板對於內嵌函式是否有用,沒有明確規定,但鼓勵編譯器實現。
編譯器支援
Visual Studio好像是從VS2008(VC9)開始支援外部模板的。GCC似乎很早就支援外部模板了,但不清楚具體是在哪一個版本中加入的,至少4.3及其以後的版本是支援的。
Ref
1. Adding "extern template" (version 2)
2. C++0x,Extern Template @ Wiki

C++11 : 外部模板(Extern Template)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.