繁体   English   中英

coroutine_handle 如何处理<promise> ::from_promise() 适用于 C++</promise>

[英]How coroutine_handle<Promise>::from_promise() works in C++

读到coroutine_handle可以使用coroutine_handle<Promise>::from_promise() ZC1C425268E68385D14AB5074C17A 从对协程 promise object 的引用重构据我所知,promise object 的定义如下:

class resumable{
public:
  struct promise_type;
  bool resume();
};

struct resumable::promise_type{
  resumable get_return_object() {/**/}
  auto initial_suspend() {/**/}
  auto final_suspend() {/**/}
  void return_void() {}
  void unhandled_exception();
};

鉴于promise_type不包含对协程句柄的任何引用,我无法弄清楚重建如何工作。 恰恰相反,协程句柄存储了对 promise object 的引用,可以通过句柄的promise()方法返回。 我找不到关于from_promise function 中实际发生的任何信息。

它通过法定货币运作。 也就是说,它之所以有效,是因为标准说它有效,因此实现必须找到一种方法来以一种可能的方式实现协程。

创建协程时,实现会创建两个东西:coroutine_handle 和 promise object。 这两件事的位置完全由编译器控制。 因此,编译器可以很容易地将它们彼此连续分配,这样协程的堆栈基本上会以struct {coroutine_handle<Promise> handle; Promise promise}; struct {coroutine_handle<Promise> handle; Promise promise}; .

有了这些知识,您就知道任何 promise 类型的句柄在任何promise对象的地址之前都存在sizeof(coroutine_handle<Promise>)个字节( Promise对象的地址的对齐要求可以从该类型中调整) 由于from_promise采用 promise object,因此您只需偏移指针并将其强制转换为coroutine_handle<Promise>

现在,这只是一种方法; 实现不必这样做。 重要的是,实现可以控制 promise object 相对于协程内部数据的位置。 或者更具体地说,promise 存在该内部数据中。 无论您如何看待它,编译器都知道将 promise 的地址转换为填充coroutine_handle所需的内部数据所需的一切。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM