多个目标文件中的 C++ 模板和编译
Posted
技术标签:
【中文标题】多个目标文件中的 C++ 模板和编译【英文标题】:C++ Templates & Compilation in multiple object files 【发布时间】:2017-11-18 09:42:02 【问题描述】:在阅读了有关模板的内容后,我对它们的编译感到困惑。例如,在标题中,我们将模板定义为 -
template<typename T>
class Object
public:
Object();
void hashCode(T& arg) /* implementation code in header-only. */
;
我们在两个源文件中使用这个模板 - SourceI.cpp & SourceII.cpp 通过包含 Object.hpp -
SourceI.cpp
void doSomething()
Object<int> intHasher;
intHasher.hashCode();
// Further code...
SourceII.cpp
void doNothing()
Object<int> notUsedHere;
notUsedHere.hashCode();
编译应该为“int”类型的类实例化生成代码。 Object
如果代码没有内联,那么符号冲突会不会因为它们会出现在多个目标文件中而导致链接?
注意 - 代码仅用于举例,不代表任何目的。
【问题讨论】:
相关:***.com/questions/495021/… 【参考方案1】:当你编译它时,SourceI.cpp 和 SourceII.cpp 都会有一个 Object
当您链接它时,链接器将假定 Object 的两个实例是相同的,并丢弃除一个之外的所有实例。
【讨论】:
所以……毕竟没有缺点(在这种情况下)。 这是否意味着链接器必须了解 C++ 模板? 另外,那么预编译的头文件就派上用场了,对吧? 是的,预编译头文件可以减少模板在不同编译单元中实例化的编译时开销。 @Andi — 第一个生成数据。第二个没有。以上是关于多个目标文件中的 C++ 模板和编译的主要内容,如果未能解决你的问题,请参考以下文章