代码之家  ›  专栏  ›  技术社区  ›  Chen Li

如何理解“大多数现代链接器都会删除多余的代码,比如模板实例化。”

  •  0
  • Chen Li  · 技术社区  · 7 年前

    here

    很好的回答。另外 大多数现代链接器都会删除模板实例化之类的冗余代码

    • 做什么 冗余模板实例化
    • 除了模板实例化,还有什么代码在 link-time

    我会尽量自己回答第一个问题,如果有什么地方错了,请纠正我。顺便说一句,请原谅我糟糕的英语:-)

    1 回复  |  直到 7 年前
        1
  •  -1
  •   Chen Li    7 年前
    • 做什么 冗余模板实例化 这是什么意思?

    template <typename T> class A {}; a.hpp . 我们有两种方法来实例化 a.cpp :

    1显式实例化

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

    • 当代码在上下文中引用需要完全定义的类型的模板时,或者当类型的完整性影响到代码和此特定类型时 , 隐式实例化发生

    A<int> a; 将调用隐式实例化。

    difference between specialization and instantiate


    让我们回一个问题:

    我将把它分成几个案例 :

    案例1——隐式实例化

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

    =>

    class A<int>
    {
    
    };
    
    A<int> a;
    

    案例2——隐式实例化

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

    =>

    class A<int> 
    {
    
    };
    
    A<int> a;
    A<int> b;
    

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

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

    =>

    #包括“a.h”
    模板类A<int>;
    

    • 隐式实例化 将生成冗余模板实例化 不会。
    • link-time .

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