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

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

DDD
发布: 2024-12-20 14:59:13
原创
276 人浏览过

How Can `extern template` in C  11 Avoid Redundant Template Instantiations?

避免使用 extern 模板实例化 (C 11)

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;在source1.cpp中,确保它在项目中只实例化一次。

重要注意事项

extern模板的使用应仅限于以下情况知道该模板将在其他地方实例化。如果没有实例化,程序将导致无法解析的引用。作为最佳实践,建议在单个头文件中声明所有模板实例化,避免不同文件中的多个实例化导致的潜在问题。

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

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