extern 模板是一个强大的 C 11 关键字,它允许开发人员阻止在特定编译单元中实例化模板。这在处理大型代码库时特别有用,其中多个源文件可能使用不同的参数实例化同一模板,从而导致重复代码并增加编译时间。
在以下情况下函数模板,extern template 可用于强制编译器在知道该函数将在其他地方实例化时不要实例化特定模板。考虑以下示例:
// header.h template<typename T> void ReallyBigFunction() { // Body }
// source1.cpp #include "header.h" void something1() { ReallyBigFunction<int>(); }
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
如果没有 extern 模板,编译器将编译ReallyBigFunction
source1.o void something1() void ReallyBigFunction<int>() // Compiled first time source2.o void something2() void ReallyBigFunction<int>() // Compiled second time
将这些文件链接在一起将生成 IndeedBigFunction
为了避免这个问题,我们可以在 source2.cpp 中使用 extern 模板:
// source2.cpp #include "header.h" extern template void ReallyBigFunction<int>(); void something2() { ReallyBigFunction<int>(); }
这将产生以下目标文件:
source1.o void something1() void ReallyBigFunction<int>() // Compiled just one time source2.o void something2() // No ReallyBigFunction<int> here because of the extern
链接这些目标文件时,第二个目标文件将使用第一个目标文件中的符号,避免重复代码并减少编译time.
extern 模板也可以与类模板一起使用,以防止特定类成员的实例化。例如:
// header.h template<typename T> class Foo { public: T f(); };
// source1.cpp #include "header.h" Foo<int> foo1;
// source2.cpp #include "header.h" extern template class Foo<int>; Foo<int> foo2;
如果没有 extern 模板,编译器会将成员函数 f 编译为 Foo
extern 模板是避免重复代码并减少 C 11 项目中编译时间的宝贵工具。通过选择性地使用 extern 模板来防止不必要的模板实例化,开发人员可以优化其代码的性能。
以上是C 11 中的'extern template”如何防止重复模板实例化并减少编译时间?的详细内容。更多信息请关注PHP中文网其他相关文章!