使用 Extern Template 优化模板实例化
在 C 11 中,extern template 是一个强大的关键字,可以用来避免冗余实例化模板,特别是当多个翻译单元(例如 .cpp 文件)可能包含包含模板的同一头文件时
Extern 模板的概念
Extern 模板本质上通知编译器当前翻译单元不应该实例化特定模板,即使它是在包含的模板中声明的标头。当您知道模板将在同一项目的不同翻译单元中实例化时,这非常有用。
函数模板的用法
对于函数模板,外部模板声明可以如下使用:
#include "header.h" extern template void f<T>(); // Avoid instantiation in this translation unit
这表明 f 模板将在项目的其他地方定义,不应该被定义在当前文件中实例化。
类模板的使用
类似地,对于类模板,外部模板声明采用以下形式:
#include "header.h" extern template class foo<int>; // Avoid instantiation in this translation unit
这确保了 foo 模板类不会在此特定翻译中实例化
优化应用
考虑以下场景:
// header.h template<typename T> void f();
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" void f<string>();
没有 extern template,两个 source1.cpp而source2.cpp会实例化f模板,导致多个定义,浪费编译时间。通过在其中一个文件中使用 extern 模板,我们可以避免这种冗余:
// source1.cpp #include "header.h" void f<int>();
// source2.cpp #include "header.h" extern template void f<int>(); void f<string>();
要点
以上是外部模板如何优化 C 中的模板实例化?的详细内容。更多信息请关注PHP中文网其他相关文章!