为何GCC无法优化通过别名调用的构造函数?
该现象属于GCC版本优化退化bug吗?
这确实是GCC 13.x版本的优化退化bug,而非C++标准要求的行为,具体分析如下:
- 两段代码逻辑完全等价,仅调用构造的方式不同:一段通过模板别名
NewA触发类模板实参推导(CTAD),另一段直接用全局作用域的::A调用。从C++标准定义来看,模板别名只是原模板的“别名”,编译器对两者的优化处理应当完全一致。 - GCC 10.1能将模板别名版本的代码完美优化为
xor eax, eax; ret,说明该版本的优化逻辑是正常的;而GCC 13.1却生成了冗余的std::string构造/析构调用,属于优化阶段的逻辑退化。 - Clang暂不支持模板别名的CTAD是特性支持度问题,和GCC的优化bug属于不同范畴,二者没有关联。
内容的提问来源于stack exchange,提问作者Dmitry
相关产品推荐
相关产品推荐

