Re[3]: [ann] Visual C++ Compiler November 2013 CTP
От: Evgeny.Panasyuk Россия  
Дата: 18.11.13 22:05
Оценка:
Здравствуйте, 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 ограничен одним уровнем.
  •  
    Подождите ...
    Wait...
    Пока на собственное сообщение не было ответов, его можно удалить.