Информация об изменениях

Сообщение Re[28]: Mногопоточность: C++ vs Erlang vs другие от 17.06.2015 7:47

Изменено 17.06.2015 10:22 Evgeny.Panasyuk

Здравствуйте, 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.
Re[28]: Mногопоточность: C++ vs Erlang vs другие
Здравствуйте, 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.