来自here:
很棒的答案。此外,最现代的链接器将删除冗余代码,如模板实例化。
link-time
时还有哪些代码会多余? 我会尽量回答第一个问题,如果出现问题,请纠正我。顺便说一句,请原谅我可怜的英语:-)
答案 0 :(得分:-1)
- 这里冗余模板实例化是什么意思?
假设我们在template <typename T> class A {};
中声明了a.hpp
。我们有两种方法来实例化a.cpp
中的对象:
template class A <type>;
extern template class A <type>;
当代码引用需要完全定义类型的上下文中的模板时,或者当类型的完整性影响代码时,并且此特定类型尚未明确实例化,隐式发生实例化
当TU找不到显式实例化定义或声明时,t A<int> a;
将调用隐式实例化。
<子> difference between specialization and instantiate 子>
让我们回答问题:这里冗余模板实例的含义是什么?
我会将其分成几个案例a.cpp
:
#include "a.h"
A<int> a;
=&GT;
class A<int>
{
};
A<int> a;
#include "a..h"
A<int> a;
A<int> b;
=&GT;
class A<int>
{
};
A<int> a;
A<int> b;
#include "a.h"
template class A<int>;
A<int> a;
=&GT;
#include "a.h"
template class A<int>;
A<int> a;
头文件中的显式实例化声明将像Case3一样行为----没有实例化冗余模板。 子>
成员函数有其他标尺,看看:https://en.cppreference.com/w/cpp/language/class_template
结论:
link-time
。如果您想知道链接器如何删除冗余模板实例,请阅读以下主题:How does the linker handle identical template instantiations across translation units?