如何理解“最现代的连接器将删除冗余的代码,如模板实例化。”

时间:2018-06-11 11:22:05

标签: c++ templates linker instantiation

来自here

  

很棒的答案。此外,最现代的链接器将删除冗余代码,如模板实例化

  • 这里冗余模板实例化是什么意思?
  • 除了模板实例化,link-time时还有哪些代码会多余?

我会尽量回答第一个问题,如果出现问题,请纠正我。顺便说一句,请原谅我可怜的英语:-)

1 个答案:

答案 0 :(得分:-1)

  
      
  • 这里冗余模板实例化是什么意思?
  •   

假设我们在template <typename T> class A {};中声明了a.hpp。我们有两种方法来实例化a.cpp中的对象:

1。显式实例化

  • 明确的实例化定义: template class A <type>;
  • 明确的实例化声明: extern template class A <type>;

2。隐式实例化

  •   

    当代码引用需要完全定义类型的上下文中的模板时,或者当类型的完整性影响代码时,并且此特定类型尚未明确实例化隐式发生实例化

当TU找不到显式实例化定义或声明时,t A<int> a;将调用隐式实例化。

<子> difference between specialization and instantiate

让我们回答问题:这里冗余模板实例的含义是什么?

我会将其分成几个案例a.cpp

案例1 ----隐式实例化

#include "a.h"
A<int> a;

=&GT;

class A<int>
{

};

A<int> a;

案例2 ----隐式实例化

#include "a..h"
A<int> a;
A<int> b;

=&GT;

class A<int> 
{

};

A<int> a;
A<int> b;

案例3 ----显式实例化定义:

#include "a.h"
template class A<int>;
A<int> a;

=&GT;

#include "a.h"
template class A<int>;
A<int> a;

结论:

  • 隐式实例化会产生冗余模板实例化,而显式实例化定义/声明会赢得。
  • 链接器将删除此类冗余模板实例,但会增加link-time

如果您想知道链接器如何删除冗余模板实例,请阅读以下主题:How does the linker handle identical template instantiations across translation units?