在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.cpp
extern template void fun<int>(int);
void test2(){
fun<int>(1);
}