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

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;
}

抱歉!评论已关闭.

  • 马上背!十九大报告中的四个“新” 2019-02-16
  • 蒲县工商质监局非公党委举办2018元旦文艺会 2019-02-16
  • 人民网评:建设数字中国时不我待 2019-02-16
  • 618史上最壕“买家”现身 Google以 5.5亿美元投资京东 2019-02-15
  • 雍正官窑:朕就是这样的品味(图) 2019-02-15
  • 西安司法考试将试点机考 2019-02-15
  • 人民日报新媒体矩阵聚焦十九大 融媒报道"给你好看" 2019-02-14
  • 社会主义是过渡阶段,最终实现共产主义才是其目的。社会主义是在消灭私有制,建立公有制直至无私,实现共产主义。 2019-02-14
  • 四轮电动车销售火爆存安全隐患 专家:需建国家标准 2019-02-14
  • 看懂汽车三元催化器工作原理后还能当金子卖?难为非洲兄弟了! 2019-02-14
  • 周杰伦昆凌为儿子庆生 小小周帅气入镜 2019-02-13
  • 都以为机器人普及了,一切都不是问题了?机器人不需要不断升级?机器人生产啥?不需要人设计? 2019-02-13
  • 价值-热门标签-华商生活 2019-02-13
  • 上合组织引领发展 吉中合作稳步前行——访吉尔吉斯斯坦总统热恩别科夫 2019-02-13
  • 互联网金融协会提示:防范变相“现金贷”业务风险 2019-02-12
  • 171| 248| 427| 566| 507| 464| 662| 741| 433| 46|