C++11:外部模板(ExternTemplate)

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

C++11:外部模板(ExternTemplate)
在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。

相关文档
最新文档