Здравствуйте, Abyx, Вы писали:
EP>>Эта штука у них спорная получилась. Надо будет кинуть в [std-proposals] сравнение pros/cons с этим.
A>ссылки одинаковые
не-до-копипастил, вот
вторая ссылка.
EP>>учитывая то что, как я понял, они у них stackful
A>странно. я думал что эти сопрограммы с await будут stackless, как в С#.
Я тоже сначала думал что stackless — тут-то пометка функции keyword'ом более-менее объяснима (функция не обычная, стэка нет, превращается в объект и т.п.).
Вот
видео с GoingNative 2013, где один из разработчиков Microsoft объясняет этот C++ async/await. На
11 слайде (10:26 на видео) как раз говорится, что их C# async/await это stackless, с явным переписыванием функции в state-machine, а версия C++ — stackful.
Более того, в их stackful корутинах await может быть только в внутри resumable функциях (то есть ограниченно одним уровнем).
In the case of ‘await,’ it is only reserved within the body of a resumable function; since there are no existing resumable functions, its introduction is not a breaking change.
То есть они дизайнили-дизайнили, и в итоге собрали все недостатки/потеряли все преимущества stackless и stackful:
stackless порождает объект state-machine, можно представить, что в C++ такой объект можно было бы перемещать/копировать. используя stackful реализацию — они лишают нас этой возможноти
небольшие stackless генераторы могут быть крайне эффективными — не нужно скакать по стэку, оптимизатор можно всё отлично заинлайнить. Их stackful всё это убивает на корню.
stackful требует аллокации стэка, причём нужного размера (у них ведь не реализован segmented stack?) — что без специального контроля может отъедать много памяти/адресного пространства и т.п.
у stackful есть killer-feature — yield/await может находится на произвольной глубине call stack, причём в этом call stack'е может быть чужой код. НО, их stackful ограничен одним уровнем.