16.1.5 控制实例化
当模板使用时才会进行实例化。这一特性意味着,相同的实例可能出现在多个对象文件中。当两个或多个独立编译的源文件使用了相同的模板,并提供了相同的模板参数时,每个文件中就都会有该模板的一个实例。
在大系统中,在多个文件中实例化相同模板的额外开销可能非常严重。在 C++ 11 中,可以通过显式实例化来避免上述开销。一个显式实例化有如下形式:
extern template declaration; // 实例化声明
template declaration; // 实例化定义
declaration 是一个类或函数声明,其中所有模板参数已被替换为模板实参,例如:
extern template class Blob<string>; // 声明
template int compare(const int &, const int &); // 定义
当编译器遇到 extern 模板声明时,它不会在本文件中生成实例化代码。将一个实例化声明为 extern 就表示承诺在程序其他位置有该实例化的一个非 extern 声明(定义)。对于一个给定的实例化版本,可能有多个 extern 声明,但必须只有一个定义。
实例化定义会实例化所有成员
16.1.6 效率与灵活性
在运行时绑定删除器
通过在运行时绑定删除器,shared_ptr 使用户重载删除器更为方便。
在编译时绑定删除器
通过在编译时绑定删除器,unique_otr 避免了间接调用删除器的运行时开销。