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

2022-07-12 05:04:00 +08:00
 GeruzoniAnsasu

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

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

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

2360 次点击
所在节点    C++
5 条回复
wdhwg001
2022-07-12 07:03:11 +08:00
把结果直接优化成常数倒是也蛮正常的吧,算是 O3 下的常规优化了。

把最初的输入从 0 这个 literal 换成 stdin 之后,coroutine 基本就被敲回原形了,理想中想要看到的把 coroutine 优化成常规代码结构,甚至优化成数学表达式的情况并没有出现,还算符合预期,没有太过魔法。
L4Linux
2022-07-12 07:31:05 +08:00
就是 constexpr 那套而已。没规定 constexpr function 不能调用 coroutine 。
GeruzoniAnsasu
2022-07-12 10:48:51 +08:00
@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-07-12 16:12:50 +08:00
好诶
Coelacanthus
2022-07-12 16:20:21 +08:00
常量优化自从 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