2

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

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

4

1 回答 1

0

就 C++ 标准而言,这可能是在最左边的领域中的出路。对于初学者来说,C++ 标准对“优化级别”或任何其他方面没有什么可说的。

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

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

A)链接器会抱怨合并不同的段,或者

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

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

于 2016-03-14T02:13:27.840 回答