1
wdhwg001 2022-07-12 07:03:11 +08:00
把结果直接优化成常数倒是也蛮正常的吧,算是 O3 下的常规优化了。
把最初的输入从 0 这个 literal 换成 stdin 之后,coroutine 基本就被敲回原形了,理想中想要看到的把 coroutine 优化成常规代码结构,甚至优化成数学表达式的情况并没有出现,还算符合预期,没有太过魔法。 |
2
L4Linux 2022-07-12 07:31:05 +08:00 via Android
就是 constexpr 那套而已。没规定 constexpr function 不能调用 coroutine 。
|
3
GeruzoniAnsasu OP @L4Linux
@wdhwg001 乍一看没什么特别的,但这不是 consteval 函数,是 coroutine. 想象一下有栈协程和动态类型的解释型语言此时在干什么(看向 v8 )。 能把并发函数优化成常量说明这个「协程」甚至不是状态机(编译器很难优化状态机),而是直接计算了 cps 变换后的结果,这就很 amazing 了。 可以看看 cppcon2016 的那个视频,当你先写了一段 sequential 代码,再改成异步,再改成 coroutine ,再把优化一开 —— boom ,一个常数! 跟魔术一样,performance makes a trick being real magic. 从 ppt 和我一点实验来看,现在的基础设施还不能把 coroutine 优化得特别好,起码还没达到 presentation 展示的最佳效果,标准库也还没跟上。等标准库完善之后编译器应该能更好地优化,从 presentation 来看,能优化的东西是有很多而且很有效的,未来可期。(指 c++26 以后) |
4
dustb1n 2022-07-12 16:12:50 +08:00
好诶
|
5
Coelacanthus 2022-07-12 16:20:21 +08:00 via Android
常量优化自从 C++11 引入 constexpr 以来就是 C++ 的拿手好戏
|