C++11 外部模板
在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 外部模板相关推荐
- 变长参数模板 和 外部模板
变长参数模板 解释 C++03只有固定模板参数.C++11 加入新的表示法,允许任意个数.任意类别的模板参数,不必在定义时将参数的个数固定. 变长模板.变长参数是依靠C++11新引入的参数包的机制实现 ...
- javascript模板库jsrender加载并缓存外部模板文件
前一篇说了jsrender嵌套循环的使用,在SPA的应用中,广泛使用的一个点就是view模板,使用了SPA之后,每个业务页面不再是独立的html,仅仅是一个segment,所以通常这些segment会 ...
- PostgreSQL 10.1 手册_部分 II. SQL 语言_第 5 章 数据定义_5.11. 外部数据
5.11. 外部数据 PostgreSQL实现了部分的SQL/MED规定,允许我们使用普通SQL查询来访问位于PostgreSQL之外的数据.这种数据被称为外部数据(注意这种用法不要和外键混淆,后者是 ...
- C++11的模板改进
C++11关于模板有一些细节的改进: 模板的右尖括号 模板的别名 函数模板的默认模板参数 模板的右尖括号 C++11之前是不允许两个右尖括号出现的,会被认为是右移操作符,所以需要中间加个空格进行分割, ...
- LaTeX外部模板(IEEEtrans)初次套用经历
最近对文档进行排版的过程中首次用到了LaTeX,所以在此将这个过程记录下来,希望对初次使用的同学有帮助. 首先说一下对Word和LaTeX的一个整体感受:Word在草稿阶段是比较方便易用的,可用来完成 ...
- c++11 之模板定义别名(using)
C++11标准中可以为模板定义别名,比如 template<typename T> using ptr=std::shared_ptr<T>; //这里模板定义ptr<T ...
- [C++11]对模板右尖括号的优化
在泛型编程中,模板实例化有一个非常繁琐的地方,那就是连续的两个右尖括号(>>)会被编译器解析成右移操作符,而不是模板参数表的结束. C++11改进了编译器的解析规则,尽可能地将多个右尖号( ...
- [C++11]函数模板的默认模板参数
在C++11中添加了对函数模板默认参数的支持. 代码如下: #include<iostream> using namespace std;template<typename T = ...
- C++11 函数模板的默认模板参数
1.函数模板默认模板参数简介 函数模板与类模板在 C++98 一起被引入,因种种原因,类模板可以拥有默认模板参数,而函数模板不可以.从 C++11 开始,这个限制被解除了,即函数模板同样可以拥有默认模 ...
- C++11 变参模板
文章目录 1.概述 2.可变模版参数的展开 2.1变参函数模版 2.1.1递归函数方式展开参数包 2.1.2逗号表达式展开参数包 2.2变参类模版 2.2.1偏特化与递归方式展开 2.2.2继承方式展 ...
最新文章
- 纪念小柴昌俊 | 中微子天体物理学的诞生
- python详细安装教程3.7.0-Python 3.7.0安装教程(附安装包) | 我爱分享网
- python中的with
- 域添加另一台机器_巨杉Tech | SequoiaDB数据域概念解读与实践
- bat批处理执行python_通过批处理来运行python程序
- 【kafka】Kafka Fetch Session 剖析
- C#_基础,初始化器
- Django的下载与基本操作
- 安装tomcat时出错:failed to install tomcat6 service问题的解决方法
- C++与QT学习路线
- 微信小程序页面倒计时
- 新买的电脑,为什么浏览器(谷歌)很卡,卡到爆,浏览器很卡怎么解决?
- Hexo | yilia主题安装
- 《写给大家看的设计书》
- VS2017配置PCL1.9(win10环境)
- 使用Excel对国外B2B电商平台进行描述性数据分析
- iPhone 更新系统后死机怎么搞定?
- python中遇到报错OSError: [Errno 22] Invalid argument的解决方法
- 每日笔记重点!!!!
- RFID-RC522/STM32F103RB/KEIL5 简单实现读取卡片ID