现在的位置: 首页 > 黄专家专栏 > 正文

C++模板显式实例化

2014年10月30日 黄专家专栏 ⁄ 共 1463字 ⁄ 字号 评论关闭

秒速赛车公式 www.l19l7.cn 讨论模板的显式实例化之前,先弄清楚什么是模板的实例化。

模板的实例化 :?指的是用具体的类型替代了模板参数的一个过程。这个过程的产物是一个模板的实例。

另外,只要在代码中正确使用模板,编译器会自动引发一个模板的实例化过程,这叫做隐式的(implicit)实例化。

例如:

1
2
3
4
5
6
7
8
9
10
11
#include<string>
#include<map>

template<class T>
void Foo(T t) {
}

int main() {
  Foo(10);
  std::map<std::string> m;
}

隐式的(implicit)实例化在使用模板时会自动地在当前代码单元之前插入模板的实例化代码。需要知道的是,在使用模板的地方,编译器通常需要访问模板和某些(如果需要的话)模板成员的定义,如果仅仅只有模板的声明,是不足够的。这也就是往往将整个模板声明和实现写在一个很大的头文件中的缘故。

几种主流的编译器对模板支持的一些实现:

Borland 模型

在每一个编译单元,编译器生成遇到的所有的模板的实例,而且链接器知道,特定的模板实例,可以在多个目标文件和程序库里面出现,那么编译器会标记他们,当链接器发现多个实例的时候,它合并他们。

这种模型的好处是显而易见的,链接器只需要考虑单个编译单元,因为所有的实例化的定义,都在目标文件中存在,每一个目标文件都包含着针对所有可以链接的模板定义代码,这降低了复杂性。

但是,缺点也是明显的,编译器生成多个模板实例,链接器合并它们,这无疑增加了编译时间,而且所有目标文件的大小总和可能会更大。

另一个不太明显的缺点是,链接器可能不会检查两个实例化体是否是一样的,因为在生成的代码中,同一个模板特化的多个实例中可能会出现一些细微的差距(C++ Template The Complete Guide 10.4.1)。

Cfront 模型

使用一个中心库,它存储了模板的实例化位置和模板的实例。编译器把遇到的模板定义与当前可生成的模板实例存放到模板仓库中。在链接阶段,链接器调用编译器生成这些模板实例,这样保证了所有相同模板实例化体的代码都是一样的,并且大大加快了编译时间。这种模式的缺点是大大增加了复杂性。

现在说回到显式实例化

显式实例化需要显式实例化指示符(explicit instantiation derective)。

1
2
3
template<class T>

template class Foo<int>;  // 基于 int 的显式实例化

但是,需要注意的是,对于在前面已经实例化的成员,你不能对它再一次实例化。

使用 -fno-implicit-templates 编译选项指定禁止隐式的模板实例化,所有模板示例都可以显式写出来。

这样的有点事实例化可以在需要的时候才进行,避免包含庞大头文件的开销,更可以把模板定义和声明分开。

加上 -fno-implicit-templates 编译选项,这样的代码就会出现链接错误,因为根本找不到模板实例。

1
2
3
4
5
6
7
8
9
#include<map>
// 必须加上显式实例化指示符
// template class std::_Rb_tree<int, std::pair<int const, int>, std::_Select1st<std::pair<int const, int> >, \
// std::less<int>, std::allocator<std::pair<int const, int> > >;
// template class std::map<int, int>;

int main() {
  std::map<int, int> m;
}

抱歉!评论已关闭.

  • 听,盲童唱出心底的阳光 2018-12-17
  • 老婆告老公索债780万 原是二人自导自演 2018-12-17
  • 井冈山交警开展重点车辆严重交通违法行为有奖举报工作 2018-12-17
  • 停车收费新政首日举报量攀升 2018-12-17
  • 这是世界杯开赛当晚的广西 2018-12-16
  • 【理上网来·喜迎十九大】建设世界一流军队的科学指南 2018-12-16
  • 第六届北京农业嘉年华--北京频道--人民网 2018-12-16
  • 【专题】节能降耗 保卫蓝天——浙江省暨杭州市2018年节能宣传周 2018-12-15
  • 【奋斗在新时代】劳道“歹猫”增色互联网“表情” 2018-12-15
  • 驾车撞倒城管队员反复碾压 义乌暴力摊贩被刑拘 2018-12-15
  • 《中国汽车报》2018“西部温暖计划”公益试驾活动即将启程 2018-12-14
  • 奇瑞新能源瑞虎3xe上市 售价8.98万 2018-12-14
  • 几家性价比超高的烤肉店 赶紧去试试 2018-12-14
  • 和“看着就想笑”说说你的“8421” 2018-12-13
  • 中共十八大以来藏语新词术语发布 2018-12-13
  • 81| 907| 253| 873| 570| 683| 67| 355| 327| 810|