首页 > 后端开发 > C++ > C 11 中的'extern template”如何防止重复模板实例化并减少编译时间?

C 11 中的'extern template”如何防止重复模板实例化并减少编译时间?

Patricia Arquette
发布: 2024-12-12 11:02:09
原创
128 人浏览过

How Can `extern template` in C  11 Prevent Duplicate Template Instantiations and Reduce Compilation Time?

在 C 11 中使用 extern 模板避免实例化

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.cpp 和 source2.cpp 中,生成以下目标文件:

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;在source1.cpp和source2.cpp中,导致重复的代码。使用 extern 模板可确保成员函数仅编译一次。

结论

extern 模板是避免重复代码并减少 C 11 项目中编译时间的宝贵工具。通过选择性地使用 extern 模板来防止不必要的模板实例化,开发人员可以优化其代码的性能。

以上是C 11 中的'extern template”如何防止重复模板实例化并减少编译时间?的详细内容。更多信息请关注PHP中文网其他相关文章!

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