使用 extern 模板避免模板实例化(C 11)
在面向对象编程中,模板在提供通用解决方案方面发挥着至关重要的作用可以处理不同的数据类型。然而,当多个源文件使用相同的参数实例化模板时,可能会导致多个定义并增加编译时间。
extern template 关键字可以用来解决这个问题,避免不必要的模板实例化。它指示编译器不要在当前翻译单元内实例化特定的模板专门化。相反,编译器依赖于在另一个源文件或链接库中实例化的模板。
函数模板
处理函数模板时,可以使用 extern 模板强制排除显式模板实例化。例如,考虑以下代码片段:
// header.h template<typename T> void f(); // source1.cpp #include "header.h" void f<int>(); // Explicit instantiation // source2.cpp #include "header.h" extern template void f<int>(); // Prevents explicit instantiation void g() { f<int>(); }
在此场景中,source1.cpp 显式实例化 f
类模板
同样的原则也适用于类模板。 extern 模板可用于避免使用相同参数多次实例化同一模板类。考虑以下示例:
// header.h template<typename T> class foo { public: void f(); }; // source1.cpp #include "header.h" template class foo<int>; // Explicit instantiation // source2.cpp #include "header.h" extern template class foo<int>; // Prevents explicit instantiation void h() { foo<int> obj; }
这里,source2.cpp 中的 extern 模板会阻止 foo
使用外部模板的好处
使用extern 模板提供了几个好处:
结论
extern template 是一个强大的关键字,可以让开发者控制模板实例化并优化编译时间。通过明智地使用它,开发人员可以确保有效地使用模板并避免多次实例化的陷阱,从而实现更快的编译和更小的可执行文件。
以上是`extern template` 如何避免 C 中的冗余模板实例化?的详细内容。更多信息请关注PHP中文网其他相关文章!