Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.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++_Templates_Gcc_Linker_Template Instantiation - Fatal编程技术网

C++ 不同优化级别编译的不同翻译单元中的模板实例化

C++ 不同优化级别编译的不同翻译单元中的模板实例化,c++,templates,gcc,linker,template-instantiation,C++,Templates,Gcc,Linker,Template Instantiation,假设我有两个翻译单元,它们都使用std::string。我用-O3编译了其中一个,另一个没有优化,然后将结果链接在一起。这两个目标文件都将包含实例化的std::string,但我希望一个版本编译时进行优化,另一个版本编译时不进行优化。链接器会在链接过程中只选择其中一个吗?如果是,哪一个?生成的可执行文件是否保证始终正确运行 更新:由于这看起来是具体的实现,所以将其缩小到GCC和CLAN行为是有意义的,因为它们都实现了定义良好的具体的IATAI ABI,而不是从C++ C++本身的角度来尝试这个问

假设我有两个翻译单元,它们都使用
std::string
。我用
-O3
编译了其中一个,另一个没有优化,然后将结果链接在一起。这两个目标文件都将包含实例化的
std::string
,但我希望一个版本编译时进行优化,另一个版本编译时不进行优化。链接器会在链接过程中只选择其中一个吗?如果是,哪一个?生成的可执行文件是否保证始终正确运行


更新:由于这看起来是具体的实现,所以将其缩小到GCC和CLAN行为是有意义的,因为它们都实现了定义良好的具体的IATAI ABI,而不是从C++ C++本身的角度来尝试这个问题。这可能是在最左边的区域中尽可能多的出路。首先,C++标准没有什么关于“优化级别”的说法,或者任何一个。 因此,这完全属于“实施定义”的范围。答案取决于您使用的确切编译器/链接器和编译器/链接器版本。一个编译器或链接器的正确答案将仅适用于该编译器或链接器。不同的编译器,甚至同一编译器的不同版本,可能会产生不同的结果

我期待两个结果中的一个:

A) 链接器将抱怨合并不相同的段,或

B) 其中一个将随机选取。可能是传递给链接器的第一个或最后一个翻译单元


因此,总而言之,要知道这个问题的答案,唯一的方法就是使用您正在使用的任何编译器或链接器进行测试,并检查结果。

只有在标准明确规定的情况下,事情才是实现定义的(这意味着实现必须记录它)。我已经更新了这个问题,将其缩小到更具体的范围。此外,我想说,更重要的部分是生成的可执行文件是否能够正确运行,这更像是一个ABI问题。
两个对象文件都将包含实例化的std::string。
它们将只包含
string
的内联成员函数。剩下的都是
libstdc++
。在这种情况下,应用与任何其他内联函数相同的行为,链接器将选择一个,可能是传递给链接器的第一个对象文件中的一个。我假设,如果唯一改变的是优化级别(而不是一些预处理器定义),那么您应该可以。