C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
C++ template function, same type, multiple instantiations: shares one same copy of code? EVEN in different cpp/object files
例如,考虑以下代码:
// f.h
template <typename T>
int f(T x) {
return x+1;
}
如果我们在foo.cpp
和bar.cpp
中都实例化:
//foo.cpp instantiation:
int i = f(1);
和
//bar.cpp instantiation:
int j = f(2);
最终程序将仅使用一份代码副本?是这样,当bar.cpp
被隐藏但仅提供对象文件bar.o
时?
我认为,由于每个CPP文件都是独立编译的,因此foo.o
和bar.o
都必须包含f(int)
。链接器应看到相同的重复签名,并仅使用一个副本。我是对的吗?
是的,链接器通常会折叠相同的模板实例化。当涉及模板时,避免二进制尺寸的爆炸几乎需要这样做,并保持某些标准所需的不变性,例如功能指针等效。此行为有时被称为 fold fiold 。
除此之外,一些链接器甚至会折叠所有发生的符号在内容中相同(即编译相同的代码),即使它们不是源于相同的定义。这有时称为 fort falue ,但是除非仔细完成,否则可能会打破标准字母(即,因为功能指向不同的函数现在比较相等)。
相关文章:
- C++我的数学有什么问题,为什么我的代码不能正确循环
- 代码在main()中运行,但在函数中出现错误
- 在VS代码中交叉编译Windows与Linux上的MinGW的SDL程序
- 编译包含字符串的代码时遇到问题
- 我在c++代码中生成了一个运行时#3异常
- 如何在linux终端中同时编译和运行c++代码
- 用于制作文件副本的代码
- 该代码调用副本或移动构造函数
- C 模板功能,相同类型,多个实例:共享一个相同的代码副本?即使在不同的CPP/对象文件中
- 使用矢量push_back代码创建对象副本时遇到问题
- 内联函数,始终 n+1 个代码副本,其中'n'是调用次数
- 我的代码正在制作 2D 数组元素的重复副本.代码中有什么问题?
- NewDirectByteBuffer是否在本机代码中创建副本
- 这段带有副本C++08的代码出错
- 我的代码是在创建对象的深层副本还是浅层副本
- 这段代码创建了多少个变量C的副本
- 避免在内存中创建多个代码副本
- 此代码将执行多少个副本
- 为什么这个代码可以消除副本
- 在汇编代码中查找不必要的缓冲区副本