使用不同优化级别编译的不同翻译单元中的模板实例化
Template instantiation in different translation units compiled with different optimization levels
假设我有两个翻译单元,都使用 std::string
.我用-O3
编译其中一个,另一个没有优化,然后将结果链接在一起。两个目标文件都将包含实例化的std::string
,但我希望一个版本通过优化进行编译,而另一个版本则没有。链接器在链接过程中是否只选择其中一个?如果是,是哪一个?生成的可执行文件是否保证始终正常运行?
更新:由于这看起来是特定于实现的,因此将其缩小到 gcc 和 clang 行为是有意义的,因为它们都实现了定义明确且具体的 Itanium ABI,而不是试图从C++标准本身的角度来看待这个问题。
就C++标准而言,这可能是最左边的领域。对于初学者来说,C++标准对"优化级别"或任何类似内容没有任何意义。
因此,这完全属于"定义的实现"的范围。答案取决于确切的编译器/链接器和你使用的编译器/链接器版本。一个编译器或链接器的正确答案仅适用于该编译器或链接器。不同的编译器,甚至同一编译器的不同版本,都可以产生不同的结果。
我期待以下两个结果之一:
A) 链接器将抱怨合并不相同的段,或
B)一个或另一个将被随机选择。可能是传递给链接器的第一个或最后一个翻译单元。
因此,总而言之,知道这个问题的答案的唯一方法是使用您正在使用的任何编译器或链接器进行尝试,并检查结果。
相关文章:
- 从C++实例化QML
- 设计一个只能由特定类实例化的类(如果可能的话,通过make_unique)
- 如何创建一个空的全局类并在启动时实例化它
- 在两个类中共享相同的函数调用,并在不需要时避免空实例化
- 约束和显式模板实例化
- 为什么包含windows.h会产生语法错误,从而阻止类的实例化?(C2146,C2065)
- 对象实例化调用构造函数的次数太多
- 如何使用非默认构造函数实例化模板化类
- 静态数据成员模板专用化的实例化点在哪里
- 错误的cv::face FacemarkLBF实例化
- C++的解析器在可以区分比较和模板实例化之前会做什么?
- 为什么 gcc 和 clang 为函数模板的实例化生成不同的符号名称?
- 检查某些类型是否是模板类 std::optional 的实例化
- 链接器如何处理跨翻译单元的相同模板实例化
- 使用不同优化级别编译的不同翻译单元中的模板实例化
- 实例化一个二维向量,其中一组对作为单元值
- 在多个翻译单元中函数模板实例化的标识
- 跨编译单元的相同函数模板实例化的地址
- 实例化的点是否可以延迟到翻译单元结束
- 使用静态char*数组成员的模板特化,在多个单元中实例化