C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中

C++ template function, same type, multiple instantiations: shares one same copy of code? EVEN in different cpp/object files

本文关键字:副本 代码 CPP 文件 对象 同类型 功能 实例 共享 一个      更新时间:2023-10-16

例如,考虑以下代码:

// f.h
template <typename T>
int f(T x) {
   return x+1;
}

如果我们在foo.cppbar.cpp中都实例化:

//foo.cpp instantiation:
int i = f(1);

//bar.cpp instantiation:
int j = f(2);

最终程序将仅使用一份代码副本?是这样,当bar.cpp被隐藏但仅提供对象文件bar.o时?

我认为,由于每个CPP文件都是独立编译的,因此foo.obar.o都必须包含f(int)。链接器应看到相同的重复签名,并仅使用一个副本。我是对的吗?

是的,链接器通常会折叠相同的模板实例化。当涉及模板时,避免二进制尺寸的爆炸几乎需要这样做,并保持某些标准所需的不变性,例如功能指针等效。此行为有时被称为 fold fiold

除此之外,一些链接器甚至会折叠所有发生的符号在内容中相同(即编译相同的代码),即使它们不是源于相同的定义。这有时称为 fort falue ,但是除非仔细完成,否则可能会打破标准字母(即,因为功能指向不同的函数现在比较相等)。