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


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


    然后就没有了。

  • 相关阅读:
    学习进度(6)
    学习进度(5)
    学习进度(4)
    学习进度(第十周)
    学习进度(第九周)
    关于返回一个整数数组中最大子数组的和的问题(续03)
    学习进度(第八周)
    代码大全阅读笔记03
    NABCD分析——生活日历
    学习进度(第七周)
  • 原文地址:https://www.cnblogs.com/ysherlock/p/7822290.html
Copyright © 2020-2023  润新知