C++11 外部模板

本文介绍了C++中如何通过外部模板和显示实例化来优化编译时间和减少冗余代码。外部模板允许编译器跳过已声明的模板实例化,而显示实例化则可以手动控制模板的实例化位置,从而避免重复工作。这种技术类似于全局变量的声明和定义,有助于提高编译效率。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值