описана в стандарте. Но сейчас их существует 1.5 (полторы) штуки. Сначала сделали в MSVS, затем Гор Нишанов активно участвовал в реализации в Clang (5.0, кажется). Там ребята сделали по-своему оптимизации (лучше, чем в MSVS), но реализация примерно та же.
Код конечного автомата корутины из исходного кода C++ преобразуется методом Даффа в единственный метод объекта-корутины. Вначале метода switch(state_idx) и далее case по каждому состоянию конечного автомата. В результате эта реализация работает быстрее подхода boost::asio, во-первых, потому что получается избавиться от некоторых выделений динамической памяти, во-вторых, компилятор лучше оптимизирует, когда весь код расположен в одной функции со switch() в начале, чем кучу мелких методов onAccept(), onRead(), onWrite().
Вот презентация от Гора Нишанова https://youtu.be/Ts-1mWBmTNE?t=4177
А как работает автомат в случае цикла? То есть там уже 2 переменные - индекс цикла и состояние автомата?
Обсуждают сегодня