多个目标文件中的 C++ 模板和编译

标签 c++ class templates object header

看完模板后,我对它们的编译感到困惑。例如,在标题中我们将模板定义为 -

template<typename T>
class Object {
public:
    Object();
    void hashCode(T& arg){ /* implementation code in header-only. */ }
};

我们通过包含 Object.hpp 在两个源文件中使用此模板 - SourceI.cpp 和 SourceII.cpp -

源代码.cpp

void doSomething()
{
    Object<int> intHasher;
    intHasher.hashCode();
    // Further code...
}

源II.cpp

void doNothing()
{
     Object<int> notUsedHere;
     notUsedHere.hashCode();
}

编译应该为“int”类型的类实例化生成代码。 Object 类型的代码存储在哪里。或者 Object::hashCode() 的代码会在所有用途中内联吗?

如果代码不是内联的,那么符号会不会在链接时发生冲突,因为它们会出现在多个目标文件中?

注意 - 该代码仅供示例,不显示任何用途。

最佳答案

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

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

关于多个目标文件中的 C++ 模板和编译,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47364593/

相关文章:

检查参数类型的 Pythonic 方法

c++ - 使用模板指定成员变量

c++ - 从成员函数指针类型中删除类指针

c++ - 链接错误 Opencv Qt '_ZN2cv6String10deallocateEv

c++ - 来自文件夹而不是 MSI 的 Windows 应用商店部署文件

c++ - QT Creator c++ 编写 Kakuro 拼图,不确定要使用什么小部件

c++ - 关于仿函数的问题

c# - 使用 linq 选择不同的

c++ - 嵌套模板类型的别名

c++ - 无法推断模板参数?