Comments 17
далее буду называть их корутинами, по‑русски
По-русски, если я верно помню, это называется сопрограммы
Под капотом компилятора корутины - это просто синтактический сахар (syntax sugar).
Я бы так не сказал - всё таки нарисовать их вручную на основе другого стандартного функционала (без системно-зависимого кода) проблематично.
Ну, если на то пошло, всё, начиная с ассемблера, -- синтаксический сахар...
Это уж очень глобально. На моё взгляд синтаксический сахар - то, что можно реализовать другими средствами того же языка. Скажем, вместо лямбды для каждого конкретного случая можно явно написать соответствующий функтор с захватом переменных в поля в конструкторе - просто это неудобно. Для реализации корутин надо поработать с контекстом исполнения - а к нему явного доступа нет.
Результаты, аналогичные сопрограммам, можно получить и чисто вручную -- но да, придётся самому выделять блок памяти, хранить в нём всё, что нужно для возобновления выполнения, и т.д. и т.п. Т.е. это тоже неудобно, но контекст здесь роли не играет -- он реально не нужен: увидел, что не можешь продолжать работу до наступления некоего события -- сохрани нужные данные в динамически полученной области, передай её адрес той подпрограмме, которая. в конечном итоге, отвечает за возобновление выполнения после наступления ожидаемого условия, а после этого верни управление вызвавшей тебя программе. Собственно, сопрограммы именно это и делают.
сохрани нужные данные в динамически полученной области
Да, так в прицнипе можно. Но разница между таким ручным сохранениям и co_await явно больше, чем случае тех же лямбд и функторов.
Нельзя сделать то же самое что корутины делают внутри.
Компилятор строит таблицы перехода специализированные, память выделяется иначе, для .resume отдельный call convention используется и так далее
А можно тоже самое, но без динамических аллокаций? Или хотя бы контролируемых.
Без динамических -- нельзя, но можно ж написать свои подпрограммы для выделения/освобождения памяти, и тогда компилятор будет дёргать их, а не свои стандартные. Соответственно, сие можно прилично оптимизировать.
Там можно подкинуть свой алокатор, пишите алокатор на стеке (это не сложно) и будет у вас корутина на стеке
А что такое Coroutine::promise?
Coroutines в C++20