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

时间:2016-03-14 01:59:18

标签: c++ templates gcc linker template-instantiation

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

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

1 个答案:

答案 0 :(得分:0)

就C ++标准而言,这可能就像在可能的情况下一样可以在最左边的字段中解决。对于初学者来说,C ++标准没有任何关于"优化级别"或其中任何一个的说法。

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

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

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

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

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