Почему std::coroutine_handle ссылается только на сопрограмму (через необработанный указатель), а не владеет ею (через std::unique_ptr)?

Мне интересно понять причину выбора дизайна, согласно которому std::coroutine_handle фактически не является владельцем состояния/фрейма сопрограммы.

Я понимаю, что (по крайней мере, обычно?) тип возвращаемого значения сопрограммы отвечает за хранение std::coroutine_handle и, следовательно, отвечает за время жизни состояния/кадра сопрограммы.

Но все же, в чем был бы недостаток, если бы std::coroutine_handle обрабатывал состояние/кадр сопрограммы через std::unique_ptr (который во время выполнения столь же эффективен, как и необработанный указатель, не так ли?)?

Неужели так ценна возможность копирования std::coroutine_handle?

Вам разрешено получить множество различных дескрипторов из одного и того же обещания или даже ни одного. Концептуально это не означает, что «дескриптор владеет сопрограммой».

StoryTeller - Unslander Monica 21.07.2024 11:04
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
71
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Когда вы await, awaiter получает доступ к сопрограмме через дескриптор сопрограммы. Он не владеет сопрограммой.

Таким образом, если бы мы добавили дескриптор владельца, нам все равно потребовался бы дескриптор, не являющийся владельцем.

Написание владеющего дескриптора сопрограммы

template<class T>
struct destroy_coroutine {
  void operator()(auto&& handle)const {
    handle.destroy();
  }
  using pointer=std::coroutine_handle<T>;
};
template<class T=void>
using unique_coroutine_handle = std::unique_ptr< std::coroutine_handle<T>, destroy_coroutine<T> >;

довольно короткий. (извиняюсь, если у меня выше опечатки; звонки на завтрак!)

Ответ принят как подходящий

Дескриптор, не являющийся владельцем, имеет смысл как часть низкоуровневого API сопрограммы. await_suspend передается дескриптор ожидающей сопрограммы, но эта сопрограмма обычно фактически принадлежит возвращаемому объекту (например, std::generator, предложенному std::task и т. д.). Таким образом, по крайней мере один из этих двух дескрипторов не должен быть владельцем. Поэтому, если язык должен предоставлять только один тип дескриптора сопрограммы, он должен быть невладеющим.

Кроме того, вы можете легко создать тип дескриптора владеющей сопрограммы, который обертывает невладеющий тип. Но на практике это, как правило, не так уж полезно, поскольку ожидается, что пользователям редко придется напрямую взаимодействовать с дескрипторами сопрограмм. Вам нужно будет написать лишь небольшое количество возвращаемых типов сопрограммы, и, надеюсь, не составит большого труда не забыть написать для них деструктор и конструктор перемещения (и, возможно, оператор перемещения перемещения).

Другие вопросы по теме

Когда пользовательский процесс заменяет страницу, находится ли виртуальный адрес страницы в пространстве пользователя или пространстве ядра?
Почему компилятор Rust удаляет неиспользуемые переменные в порядке, обратном их объявлению?
Проблема стирания элементов в векторе с помощью C
Могу ли я доказать монотонность ассигнований с помощью Rust Borrow Checker
Почему нам следует устанавливать для -XX:InitialRAMPercentage и -XX:MaxRAMPercentage одно и то же значение для облачной среды?
Есть ли что-то вроде указателя для массивов numpy?
C Могу ли я использовать данные, которые я освободил сразу после освобождения?
Веб-скрапинг в R с использованием циклов while. Ошибка в open.connection(x, «rb»): ошибка HTTP 429, когда веб-страница существует
Как обрабатывать данные о ценах на криптовалюту и токены в режиме реального времени на сервере, память моего сервера через некоторое время переполняется
Fread() читает неправильные данные, хотя предыдущий фрагмент был прочитан правильно