c++ 编译器是否可以删除具有相同定义的重复lambda表达式?[副本]

k2arahey  于 2023-05-30  发布在  其他
关注(0)|答案(1)|浏览(488)

此问题已在此处有答案

Why design a language with unique anonymous types?(9个回答)
Why does each instantiation of a lambda function result in a unique type?(1个答案)
5天前关闭。
完整的代码在这里:https://godbolt.org/z/7sbxeM3WP
我很好奇编译器是否有可能优化

constexpr auto lambda = [](){return 5;};
constexpr auto lambda_same_definition = [](){return 5;};

这样就只有一个生成的函子。我知道lambda表达式是如何工作的,为每个表达式创建匿名函子。但至少在这里看起来很明显,因为表达式字面上是相同的,char对char,加上它们存储为constexpr,编译器似乎不可能将两个函子折叠成一个。当然,我怀疑这种推理在一般情况下是可行的,在一般情况下,判断两个函数的发音是否相同,可能是无法判定的。
不幸的是,从我的Godbolt代码片段中看起来并不是这样,它似乎在类型名称*NL6lambdaMUlvE_E1NL22lambda_same_definitionMUlvE_E下都有信息。
所以我的问题是,这是执行质量的问题吗?或者标准中是否有禁止这种优化的内容?

nzk0hqpo

nzk0hqpo1#

每个lambda都是一个唯一的匿名类。这将是一个起点。
C++标准允许编译器实现任何没有明显效果的优化。如果编译器可以证明使用匿名类的单个示例不会产生可观察到的效果,则允许编译器实现它。
因此,如果有人想知道“是否有可能”做到这一点,答案是:是的,有可能。
您的编译器是否成功地实现了这种优化只能通过检查编译器生成的实际代码来确定。

相关问题