coroutine_handle<Promise>::from_promise() 如何在 C++ 中工作

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

read coroutine_handle 可以使用 coroutine_handle<Promise>::from_promise() 函数从对协程的 promise 对象的引用中重构。据我所知,promise 对象是这样定义的:

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对象的引用,可以通过句柄的promise()方法返回。我找不到任何关于 from_promise 函数中实际发生的信息。

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

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

开头

根据这些知识,您知道任何 promise 类型的句柄都存在于任何 promise 对象地址之前的 sizeof(coroutine_handle<Promise>) 字节(Promise 类型的对齐要求可以调整这一点,但是这些东西可以从类型中查询)。由于 from_promise 接受一个 promise 对象,您可以只偏移指针并将其转换为 coroutine_handle<Promise>.

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

所需的内部数据所需的一切。