首页 > 后端开发 > C++ > `extern template` 如何避免 C 中的冗余模板实例化?

`extern template` 如何避免 C 中的冗余模板实例化?

Barbara Streisand
发布: 2024-12-14 12:50:12
原创
683 人浏览过

How Does `extern template` Avoid Redundant Template Instantiation in C  ?

使用 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;而source2.cpp使用extern模板来防止不必要的实例化。当 f 时,编译器将使用 source1.cpp 中的实例化。在source2.cpp中调用。

类模板

同样的原则也适用于类模板。 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 的显式实例化,从而确保使用 source1.cpp 中的实例化。

使用外部模板的好处

使用extern 模板提供了几个好处:

  • 减少编译时间:通过避免不必要的模板实例化,可以显着减少编译时间。
  • 更小的目标文件: 同一模板的多个实例化会产生更大的目标文件。 extern template 有助于消除这个问题。
  • 一致的代码:通过确保模板仅实例化一次,可以提高一致性并降低错误风险。

结论

extern template 是一个强大的关键字,可以让开发者控制模板实例化并优化编译时间。通过明智地使用它,开发人员可以确保有效地使用模板并避免多次实例化的陷阱,从而实现更快的编译和更小的可执行文件。

以上是`extern template` 如何避免 C 中的冗余模板实例化?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板