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

来源:互联网 发布:奥鹏教师网络研修总结 编辑:程序博客网 时间:2024/05/20 05:04

最近再次看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是用户定义的类型.


然后就没有了。

0 0
原创粉丝点击