Size: a a a

Конференция C++ Russia

2021 July 21

AT

Alexey Tkachenko in Конференция C++ Russia
в го передачи по ссылке нету?
источник

EP

Egor Pugin in Конференция C++ Russia
не понимаю, "каждый вложенный вызов корутины" что это значит? что значит "рекурсивно"?
источник

A

Arelav in Конференция C++ Russia
Там используется escape analysis. Чтобы понять нужно выделять обьект на куче или нет и можно на стеке
источник

AK

Artem Khoroshev in Конференция C++ Russia
Почему?
источник

AT

Alexey Tkachenko in Конференция C++ Russia
я просто спрашиваю, я не гошник совсем-совсем
источник

m

magras in Конференция C++ Russia
Вложенный вызов корутины:

task<string> get_data_from_network();
task<int> get_the_answer() {
 co_return strtoi(co_await get_data_from_network());
}


С ходу предложить полезную рекурсивную корутину я не могу, но стандарт их не запрещает.
источник

EP

Egor Pugin in Конференция C++ Russia
так и пусть спавнятся. А под условием "вложенная" корутина? Опять не проанализируем
источник

m

magras in Конференция C++ Russia
Ну и так как stackless корутины является вирусными, то глубина корутин в практических проектах может быть весьма приличной.
источник

m

magras in Конференция C++ Russia
Не распарсил.
источник

EP

Egor Pugin in Конференция C++ Russia
откуда берётся глубина? Корутина привязывается к её промису, от этого стек не растёт
источник

m

magras in Конференция C++ Russia
new на каждый вызов корутины это ок?
источник

EP

Egor Pugin in Конференция C++ Russia
да мы уже арену в 8 ГБ под все наши корутины выделили
источник

AT

Alexey Tkachenko in Конференция C++ Russia
в .NET есть Task Task.WhenAll(params Task[] tasks)
это то, что подразумевалось под рекурсивной таской?
источник

m

magras in Конференция C++ Russia
Зачем же микроскопом по гвоздям? =)
источник

EP

Egor Pugin in Конференция C++ Russia
это ок, new мы тоже управляем - используется new типа-промиса. Арены так арены, быстрые jemalloc/ещё какой-то маллок - пожалуйста
источник

m

magras in Конференция C++ Russia
На мой взгляд вызов функции управления памятью в промис - это уже косяк компилятора. Я бы хотел, чтобы в 99% случаев компилятор его не делал. В простых случаеях он его и не будет делать.
источник

EP

Egor Pugin in Конференция C++ Russia
вот тут в простом случае можно пробовать такую оптимизацию. А в общем случае - нам надо создать корутину. Не на стеке. Как у нас память выделяется? new
источник

m

magras in Конференция C++ Russia
Нет. Формально можно тот же факториал посчитать. Мне кажется на практике рекурсивные корутины могут быть полезны в парсерах, но я такого не писал и могу ошибаться.
источник

AK

Artem Khoroshev in Конференция C++ Russia
я тоже не гошник) чуть выше уже было упомнинание за счет чего это достигается — escape анализ, в интернетах куча информации про это
источник

m

magras in Конференция C++ Russia
Еще раз, моя позиция заключается в том, что без оптимизации убирающей алокации, stackless корутины мне не интересны.

Да, я знаю, что я могу контролировать как корутины будут выделять память и что по-умолчанию там стоит обычный new. И да, при определенных условиях невозможно избежать вызова функции управления памятью в promise_type. Но по своему опыту я могу сказать, что в простых случаях эта оптимизация уже работает, но я не исследовал когда и где она ломается.
источник