首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >C++模板显式实例化,隐式实例化,特化(具体化,偏特化)辨析

C++模板显式实例化,隐式实例化,特化(具体化,偏特化)辨析

作者头像
racaljk
发布2018-08-31 11:14:33
1.1K0
发布2018-08-31 11:14:33
举报
文章被收录于专栏:racaljkracaljk

最近再次看C++ PRIMER PLUS的时候看到这个部分感觉讲得很烂,前后口径不一致,所以写个辨析让自己明白的同时也希望对此不太清楚的朋友能搞懂。

总结一下,C++只有模板显式实例化(explicit instantiation),隐式实例化(implicit instantiation),特化(specialization,也译作具体化,偏特化)。首先考虑如下模板函数代码:

template <typename T>
void swap(T &a, T &b){
...
}

1.隐式实例化

我们知道,模板函数不是真正的函数定义,他只是如其名提供一个模板,模板只有在运行时才会生成相应的实例,隐式实例化就是这种情况:

int main(){
    ....
    swap<int>(a,b);
    ....
}

它会在运行到这里的时候才生成相应的实例,很显然的影响效率

这里顺便提一下swap<int>(a,b);中的<int>是可选的,因为编译器可以根据函数参数类型自动进行判断,也就是说如果编译器不不能自动判断的时候这个就是必要的;

2.显式实例化

前面已经提到隐式实例化可能影响效率,所以需要提高效率的显式实例化,显式实例化在编译期间就会生成实例,方法如下:

template void swap<int>(int &a,int &b);

这样就不会影响运行时的效率,但编译时间随之增加。

3.特化

这个swap可以处理一些基本类型如long int double,但是如果想处理用户自定义的类型就不行了,特化就是为了解决这个问题而出现的:

template <> void swap<job>(job a,job b){...}

其中job是用户定义的类型.

然后就没有了。

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017-11-12 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档