c++20 coroutine 实现的 generator 可以被优化成常数

2022 年 7 月 12 日
 GeruzoniAnsasu

RT: https://godbolt.org/z/co9qTq1GP

代码不是我写的,是更早的 https://godbolt.org/g/26viuZ

ref:
cppcon2016: c++ coroutines under the covers
cppcon2018: nano-coroutines

3835 次点击
所在节点    C++
5 条回复
wdhwg001
2022 年 7 月 12 日
把结果直接优化成常数倒是也蛮正常的吧,算是 O3 下的常规优化了。

把最初的输入从 0 这个 literal 换成 stdin 之后,coroutine 基本就被敲回原形了,理想中想要看到的把 coroutine 优化成常规代码结构,甚至优化成数学表达式的情况并没有出现,还算符合预期,没有太过魔法。
L4Linux
2022 年 7 月 12 日
就是 constexpr 那套而已。没规定 constexpr function 不能调用 coroutine 。
GeruzoniAnsasu
2022 年 7 月 12 日
@L4Linux
@wdhwg001

乍一看没什么特别的,但这不是 consteval 函数,是 coroutine.
想象一下有栈协程和动态类型的解释型语言此时在干什么(看向 v8 )。
能把并发函数优化成常量说明这个「协程」甚至不是状态机(编译器很难优化状态机),而是直接计算了 cps 变换后的结果,这就很 amazing 了。


可以看看 cppcon2016 的那个视频,当你先写了一段 sequential 代码,再改成异步,再改成 coroutine ,再把优化一开
——
boom ,一个常数!

跟魔术一样,performance makes a trick being real magic.

从 ppt 和我一点实验来看,现在的基础设施还不能把 coroutine 优化得特别好,起码还没达到 presentation 展示的最佳效果,标准库也还没跟上。等标准库完善之后编译器应该能更好地优化,从 presentation 来看,能优化的东西是有很多而且很有效的,未来可期。(指 c++26 以后)
dustb1n
2022 年 7 月 12 日
好诶
Coelacanthus
2022 年 7 月 12 日
常量优化自从 C++11 引入 constexpr 以来就是 C++ 的拿手好戏

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/865556

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX