Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 模板对象代码复制_C++_Linker_Compiler Optimization_Object Files - Fatal编程技术网

C++ 模板对象代码复制

C++ 模板对象代码复制,c++,linker,compiler-optimization,object-files,C++,Linker,Compiler Optimization,Object Files,第一:不,我不是在问模板专业化 假设以下示例:我有一个带有通用方法的头文件: template <typename T> T foo(T bar) { return bar; } 模板 丁福(丁巴){ 返回杆; } 在第二个名为file1.cpp的文件中,我将该方法用作foo(42)。现在据我所知,编译器将在生成的file1.o对象文件中为模板方法生成目标代码 现在,如果我有10000个文件,它们都使用int-template参数的方法,编译器将生成10000次相同的代码

第一:不,我不是在问模板专业化

假设以下示例:我有一个带有通用方法的头文件:

template <typename T>
T foo(T bar) {
    return bar;
}
模板
丁福(丁巴){
返回杆;
}
在第二个名为
file1.cpp的文件中,我将该方法用作
foo(42)。现在据我所知,编译器将在生成的
file1.o
对象文件中为模板方法生成目标代码

现在,如果我有10000个文件,它们都使用int-template参数的方法,编译器将生成10000次相同的代码,因为目标代码的生成独立于所有其他对象(至少我认为是这样)


我的问题是:一旦链接器将所有10000个对象文件合并到我的二进制文件中,他是否会在同一代码中复制10000次,或者他是否能检测到这一点并只包含一次方法(每个模板类型)?

这取决于此。实际上,这取决于编译器的实现质量。某些实现(例如编译器和链接器组合)能够将模板的重复实例化滚动到一个模板中,但默认情况下没有配置为这样做,因此您需要阅读文档以找到特定的配置(或命令行)选项。C++11(及更高版本)实现支持外部模板(大致上,如果知道模板在另一个编译单元中实例化,可以使用外部模板强制编译器不实例化模板)在每次使用时内联函数,而不是10000个函数调用。与模板无关,也适用于常规内联函数。如果链接器不将它们合并为一个函数,考虑到这些函数必须具有相同的address@PasserBy-模板化函数的多个实例(在不同的编译单元中实例化)不一定所有实例都有相同的地址—这是实现质量的问题。尤其是在较旧的实现中,默认情况是不将复制的模板化实例化折叠为一个。直到后来,编译器实现技术才开发出来,允许将复制的实例化折叠为一个一个。