Здравствуйте, vdimas, Вы писали:
V>>Вдогонку. Что насчет локальных переменных корутины? Где их хранить?
EP>Так в этом же вся суть
EP>Функция автоматически преобразовывается в класс-автомат, и её локальные переменные становятся полями класса.
EP>Тоже самое например происходит в показанном ранее примере C# — обрати внимание на исходный код с await, на переменную result, и на поле <result>5__1 в сгенерированном коде
V>Я тебе на это уже отвечал — на примере C# видно, что корутина (произвольного размера) создаётся в куче, реализует некий публичный интерфейс, а локально мы имеем лишь ссылку на этот интерфейс.
Ты перескакиваешь с темы на тему. Тут я показываю что локальные переменные прекрасно хранятся в полях класса-автомата.
V>Т.е. для случая расположения корутины на куче у нас не страдает система типов, т.к. мы можем привести корутину к одному из известных типов,
А почему ты считаешь что она страдает в описываемом мной случае? У нас есть доступ к конкретному типу конкретной корутины, и даже известен sizeof — делай с ним что хочешь.
V>воспользовавшись рантайм-полиморфизмом, который работает исключительно и только для ссылочных типов данных.
Рантайм полиморфизм это тоже ортогонально к теме — так как он добавляется совершенно неинтрузивно, смотри примеры std::function и any_iterator.
V>>>Где будет хранится локальная переменная tmp в твоём случае, т.е. когда iterator<> — это полностью value-type объект?
EP>>Она будет хранится внутри объекта-автомата, который будет хранится внутри самого итератора. Естественно тип итератора будет зависеть от типа класса-автомата.
V>Ну вот на это я и намекал неделей ранее ))
А я где-то говорил другое? Очевидно что zero-overhead без этого никак не получить.
V>В общем, выходит так, что пользоваться такой корутиной можно только через auto,
Нет, это не так. Создаём корутину-генератор — имя класса concrete_generator. Для неё есть функции begin/end возвращающие coroutine_iterator<concrete_generator> — и ничто не мешает выписать вручную этот тип.
V>но не означает ли это невозможность использования сериализации?
Даже если "только через auto" — нет, не означает, так как есть decltype.