C 11 中的 extern 模板关键字提供了一种机制来防止不必要的模板实例化,从而减少编译时间和目标文件尺寸。在某些情况下,知道模板将在其他地方实例化并使用此关键字指示编译器不要执行实例化是有益的。
与问题中提供的示例相反, extern template 关键字也可以用于函数模板。考虑以下示例:
// header.h template<typename T> void bigFunc(); // source1.cpp #include "header.h" void something1() { bigFunc<int>(); } // source2.cpp #include "header.h" extern template void bigFunc<int>(); // This prevents its compilation in source2.cpp void something2() { bigFunc<int>(); }
如果没有 extern 模板语句,bigFunc 将在 source1.cpp 和 source2.cpp 中编译,从而导致冗余的目标代码。通过使用 extern 模板,指示编译器不要在 source2.cpp 中实例化 bigFunc,从而减少编译时间和目标文件大小。
如问题图2所示,extern模板也可以用于类templates:
// header.h template<typename T> class myClass { T getValue(); }; // source1.cpp #include "header.h" extern template class myClass<int>; // Prevent instantiation here void something1() { myClass<int> obj; obj.getValue(); }
在这种情况下,编译器被指示不要实例化 myClass
extern模板的使用应仅限于以下情况知道该模板将在其他地方实例化。如果没有实例化,程序将导致无法解析的引用。作为最佳实践,建议在单个头文件中声明所有模板实例化,避免不同文件中的多个实例化导致的潜在问题。
以上是C 11 中的'extern template”如何避免冗余模板实例化?的详细内容。更多信息请关注PHP中文网其他相关文章!