【问题标题】:How coroutine_handle<Promise>::from_promise() works in C++coroutine_handle<Promise>::from_promise() 如何在 C++ 中工作
【发布时间】:2020-02-26 04:22:08
【问题描述】:

read 认为coroutine_handle 可以使用coroutine_handle&lt;Promise&gt;::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 函数中实际发生的信息。

【问题讨论】:

  • 这是编译器的魔法。其他需要编译器魔法的东西是 std::initializer_list 和 std::has_trivial_constructor 和 std::has_virtual_destructor

标签: c++ c++20 c++-coroutine


【解决方案1】:

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

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

鉴于这些知识,您知道任何 Promise 类型的句柄位于任何 promise 对象的地址之前的 sizeof(coroutine_handle&lt;Promise&gt;) 字节(Promise 类型的对齐要求可以调整这一点,但可以从类型中查询此类内容)。由于from_promise 接受了一个promise 对象,因此您只需偏移指针并将其转换为coroutine_handle&lt;Promise&gt;

现在,这只是一种方法;实现不必这样做。重要的是实现可以控制承诺对象相对于协程内部数据的位置。或者更具体地说,承诺存在于该内部数据的内部。不管你怎么看,编译器都知道将 Promise 的地址转换为填写coroutine_handle 所需的内部数据所需的一切。

【讨论】:

    猜你喜欢
    • 2019-08-07
    • 1970-01-01
    • 2020-08-10
    • 2016-03-17
    • 2020-01-28
    • 2015-03-17
    • 2020-04-19
    • 2023-04-08
    • 2023-01-10
    相关资源
    最近更新 更多