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

Template instantiation in different translation units compiled with different optimization levels

本文关键字:单元 实例化 翻译 编译 优化      更新时间:2023-10-16

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

更新:由于这看起来是特定于实现的,因此将其缩小到 gcc 和 clang 行为是有意义的,因为它们都实现了定义明确且具体的 Itanium ABI,而不是试图从C++标准本身的角度来看待这个问题。

就C++标准而言,这可能是最左边的领域。对于初学者来说,C++标准对"优化级别"或任何类似内容没有任何意义。

因此,这完全属于"定义的实现"的范围。答案取决于确切的编译器/链接器和你使用的编译器/链接器版本。一个编译器或链接器的正确答案仅适用于该编译器或链接器。不同的编译器,甚至同一编译器的不同版本,都可以产生不同的结果。

我期待以下两个结果之一:

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

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

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