多个目标文件中的 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 类型的代码存储在哪里。或者 Object::hashCode() 的代码会在所有用途中内联吗?

如果代码没有内联,那么符号冲突会不会因为它们会出现在多个目标文件中而导致链接?

注意 - 代码仅用于举例,不代表任何目的。

【问题讨论】:

相关:***.com/questions/495021/… 【参考方案1】:

当你编译它时,SourceI.cpp 和 SourceII.cpp 都会有一个 Object 的副本。这称为代码膨胀,是使用模板的缺点之一。

当您链接它时,链接器将假定 Object 的两个实例是相同的,并丢弃除一个之外的所有实例。

【讨论】:

所以……毕竟没有缺点(在这种情况下)。 这是否意味着链接器必须了解 C++ 模板? 另外,那么预编译的头文件就派上用场了,对吧? 是的,预编译头文件可以减少模板在不同编译单元中实例化的编译时开销。 @Andi — 第一个生成数据。第二个没有。

以上是关于多个目标文件中的 C++ 模板和编译的主要内容,如果未能解决你的问题,请参考以下文章

C++模板进阶

C++模板进阶

模板与分离编译模式

C++源文件从文本到可执行文件经历的过程?

C++ 常用命令行开发工具(Linux)

在自定义目标运行后重建依赖目标