在C++98/03语言标准中,对于源代码中出现的每一处模板实例化,编译器都需要去做实例化的工作;而在链接时,链接器还需要移除重复的实例化代码。显然,让编译器每次都去进行重复的实例化工作显然是不必要的,并且连接器也因此受累。

作用:对编译器的编译时间的优化,减少冗余的代码,减少开销。

显示实例化语法:template class vector<MyClass>;
外部模板语法:extern template class vector<MyClass>;
一旦在一个编译单元中使用了外部模板声明(如extern template class vector<MyClass>;),那么编译器在编译该编译单元时,会跳过与该外部模板声明匹配的模板实例化(如vector<MyClass>)。

在C++0x中,“模板的显示实例化指令、外部模板指令和使用”可以类比为“全局变量的定义、声明和使用”。区别仅在于,模板代表代码,而变量代表一段连续内存空间。

基本原理和extern变量差不多。见c++ extern学习_小飞侠hello的博客-CSDN博客

//fun.h
template <typename T>
void fun(T t){
}//use1.cpp
void test1(){fun<int>(1);
}//use2.cpp
void test2(){fun<int>(1);
}

fun.h定义了模版函数fun, 在use1.cpp和use2.cpp中都使用了该模版函数,在编译这两个cpp文件时需要分别实例化, 这就涉及到性能问题。

采用外部模板

//fun.h
template <typename T>
void fun(T t){
}//use1.cpp
void test1(){fun<int>(1);
}//use2.cppextern template void fun<int>(int);
void test2(){fun<int>(1);
}

C++11 外部模板相关推荐

  1. 变长参数模板 和 外部模板

    变长参数模板 解释 C++03只有固定模板参数.C++11 加入新的表示法,允许任意个数.任意类别的模板参数,不必在定义时将参数的个数固定. 变长模板.变长参数是依靠C++11新引入的参数包的机制实现 ...

  2. javascript模板库jsrender加载并缓存外部模板文件

    前一篇说了jsrender嵌套循环的使用,在SPA的应用中,广泛使用的一个点就是view模板,使用了SPA之后,每个业务页面不再是独立的html,仅仅是一个segment,所以通常这些segment会 ...

  3. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据

    5.11. 外部数据 PostgreSQL实现了部分的SQL/MED规定,允许我们使用普通SQL查询来访问位于PostgreSQL之外的数据.这种数据被称为外部数据(注意这种用法不要和外键混淆,后者是 ...

  4. C++11的模板改进

    C++11关于模板有一些细节的改进: 模板的右尖括号 模板的别名 函数模板的默认模板参数 模板的右尖括号 C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割, ...

  5. LaTeX外部模板(IEEEtrans)初次套用经历

    最近对文档进行排版的过程中首次用到了LaTeX,所以在此将这个过程记录下来,希望对初次使用的同学有帮助. 首先说一下对Word和LaTeX的一个整体感受:Word在草稿阶段是比较方便易用的,可用来完成 ...

  6. c++11 之模板定义别名(using)

    C++11标准中可以为模板定义别名,比如 template<typename T> using ptr=std::shared_ptr<T>; //这里模板定义ptr<T ...

  7. [C++11]对模板右尖括号的优化

    在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束. C++11改进了编译器的解析规则,尽可能地将多个右尖号( ...

  8. [C++11]函数模板的默认模板参数

    在C++11中添加了对函数模板默认参数的支持. 代码如下: #include<iostream> using namespace std;template<typename T = ...

  9. C++11 函数模板的默认模板参数

    1.函数模板默认模板参数简介 函数模板与类模板在 C++98 一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以.从 C++11 开始,这个限制被解除了,即函数模板同样可以拥有默认模 ...

  10. C++11 变参模板

    文章目录 1.概述 2.可变模版参数的展开 2.1变参函数模版 2.1.1递归函数方式展开参数包 2.1.2逗号表达式展开参数包 2.2变参类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展 ...

最新文章

  1. 纪念小柴昌俊 | 中微子天体物理学的诞生
  2. python详细安装教程3.7.0-Python 3.7.0安装教程(附安装包) | 我爱分享网
  3. python中的with
  4. 域添加另一台机器_巨杉Tech | SequoiaDB数据域概念解读与实践
  5. bat批处理执行python_通过批处理来运行python程序
  6. 【kafka】Kafka Fetch Session 剖析
  7. C#_基础,初始化器
  8. Django的下载与基本操作
  9. 安装tomcat时出错:failed to install tomcat6 service问题的解决方法
  10. C++与QT学习路线
  11. 微信小程序页面倒计时
  12. 新买的电脑,为什么浏览器(谷歌)很卡,卡到爆,浏览器很卡怎么解决?
  13. Hexo | yilia主题安装
  14. 《写给大家看的设计书》
  15. VS2017配置PCL1.9(win10环境)
  16. 使用Excel对国外B2B电商平台进行描述性数据分析
  17. iPhone 更新系统后死机怎么搞定?
  18. python中遇到报错OSError: [Errno 22] Invalid argument的解决方法
  19. 每日笔记重点!!!!
  20. RFID-RC522/STM32F103RB/KEIL5 简单实现读取卡片ID

热门文章

  1. yarn 安装使用小记
  2. PHP数据库操作:从MySQL原生API到PDO
  3. 使用jQuery.form插件,实现完美的表单异步提交
  4. 常见的系统故障及排除
  5. .net开源CMS系统使用教程之:如何用We7 CMS建设全新网站
  6. excel_applications
  7. 微信小程序的三级分销-项目表格设计
  8. 书籍-Java性能调优指南
  9. 无法保存关闭文件 苹果电脑 显示正在保存_??Linux文件编辑 - 给你骨质唱疏松
  10. 7x android 8,内测开启 华为荣耀畅玩7X升级Android 8.0