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++
。在这种情况下,应用与任何其他内联函数相同的行为,链接器将选择一个,可能是传递给链接器的第一个对象文件中的一个。我假设,如果唯一改变的是优化级别(而不是一些预处理器定义),那么您应该可以。