模板隐式专业化和链接,它是如何工作的?



我们能解释一下,模板实例化是什么时候发生的吗?假设我们有{libA,libB},一个依赖于另一个(例如libA->libB)&让A.h声明模板类Foo{};包含在两个模块的源中。接下来两个来源都使用Foo;但它们将是这个Foo的代码;它会在libA&在libB中使用?或者mb两者都将实现Foo,但是重复符号呢?

1)libA和libB是静态库:实现模板实例化的代码将在这两个库中。当两个库链接在一起时,最终输出中只有一个代码副本。链接器需要足够智能,能够处理模板实例化产生的重复代码,这样就不会出现多个定义错误。这种行为在所有C++实现中都是统一的。实现这一目标的方式可能因实施方式而异。在Microsoft C++中,这是通过COMDAT实现的。

2)libA和libB是DLL导入库:在这种情况下,实现模板实例化的代码无论如何都不会在库中。所以链接器没有什么特别的事情可做。代码将在DLL中,每个DLL一个副本。

最新更新