有两种 coroutine 的实现方法。
一是在编译时把 coroutine 函数变换成 coroutine 对象,其中的所有本地变量都变换成对象的成员变量,原 coroutine 变换成 operator(),再添加一个状态. 原 coroutine 函数在开始处插入根据当前状态跳转 co_yield 语句的一系列 switch() 语句。
二是使用汇编的 jmp. 当一个函数调用了 yield_coroutine() 跳到另外一个 coroutine 时,就保存当前 CPU 内所有的寄存器值,恢复目标 coroutine 的寄存器值,再执行一个 jmp 搞定。
前者是显式的,cpp20 采用的就是这种办法。后者是隐式的,我自己写的 coroutine 库采用这种办法。
【 在 eematlab (一辰未冉) 的大作中提到: 】
: coroutine我早懂了, 不懂的是c 的实现细节。
: 发自「今日水木 on PCT-AL10」
--
FROM 112.47.122.*