V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
GeruzoniAnsasu
V2EX  ›  C++

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

  •  
  •   GeruzoniAnsasu ·
    pnck · 2022-07-12 05:04:00 +08:00 · 2591 次点击
    这是一个创建于 843 天前的主题,其中的信息可能已经有所发展或是发生改变。
    5 条回复    2022-07-12 16:20:21 +08:00
    wdhwg001
        1
    wdhwg001  
       2022-07-12 07:03:11 +08:00
    把结果直接优化成常数倒是也蛮正常的吧,算是 O3 下的常规优化了。

    把最初的输入从 0 这个 literal 换成 stdin 之后,coroutine 基本就被敲回原形了,理想中想要看到的把 coroutine 优化成常规代码结构,甚至优化成数学表达式的情况并没有出现,还算符合预期,没有太过魔法。
    L4Linux
        2
    L4Linux  
       2022-07-12 07:31:05 +08:00 via Android
    就是 constexpr 那套而已。没规定 constexpr function 不能调用 coroutine 。
    GeruzoniAnsasu
        3
    GeruzoniAnsasu  
    OP
       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
        4
    dustb1n  
       2022-07-12 16:12:50 +08:00
    好诶
    Coelacanthus
        5
    Coelacanthus  
       2022-07-12 16:20:21 +08:00 via Android
    常量优化自从 C++11 引入 constexpr 以来就是 C++ 的拿手好戏
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1264 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 25ms · UTC 23:20 · PVG 07:20 · LAX 16:20 · JFK 19:20
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.