完整代码可在此处获取:https://godbolt.org/z/7sbxeM3WP
我很好奇编译器是否可以优化
constexpr auto lambda = [](){return 5;};
constexpr auto lambda_same_definition = [](){return 5;};
这样就只有一个生成的仿函数。我知道 lambda 表达式在幕后是如何工作的,为每个表达式创建匿名仿函数。但至少在这里看起来很明显,因为表达式实际上是相同的,char for char,而且它们存储为 constexpr
,编译器可以将两个仿函数合二为一似乎并不是不可能的。当然,我怀疑这种类型的推理在一般情况下是否可行,我猜测在一般情况下确定两个函数是否相同的声音可能是无法确定的。
不幸的是,从我的 Godbolt 代码片段来看,情况并非如此,它似乎在类型名称 *NL6lambdaMUlvE_E1
下都有这两个信息。和NL22lambda_same_definitionMUlvE_E
.
所以我的问题是,这是实现质量问题吗?或者标准中是否有禁止这种优化的内容?
最佳答案
每个 lambda 都是一个唯一的匿名类。这将是起点。
C++ 标准允许编译器实现任何没有明显效果的优化。如果编译器可以证明使用匿名类的单个实例不会产生明显的影响,则允许编译器实现它。
因此,如果有人想知道“是否可能”这样做,答案是:是的,这是可能的。
您的编译器是否成功实现了此优化只能通过检查编译器生成的实际代码来确定。
关于c++ - 编译器可以删除具有相同定义的重复 lambda 表达式吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/76327824/