Здравствуйте, gandjustas, Вы писали:
COF>>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. G>Осмысленное в твоем понимании — ручное?
Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
Здравствуйте, MxKazan, Вы писали:
MK>Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды? MK>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
Примерно то же самое, кстати, должен делать и компилятор C++. Лямбда тоже преобразуется в класс с единственным методом (не считая конструктора копии, кажется) — "operator()(сигнатура, выведенная из параметров лямбды)".
По сути вопроса — понятно. Не знаешь, значит — не знаешь.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, Хвост, Вы писали:
Х>Здравствуйте, gandjustas, Вы писали:
Х>>>Здравствуйте, gandjustas, Вы писали:
G>>>>А если у тебя вся программа состоит из таких нтенсивных операций, например высоконагруженный сервер? Х>>>даа, вся программа состоит из аллокаций в хипе, такую ещё поискать надо, а как же твои незабвенные 10% кода отнимают 90% ресурсов? или ето не распространяется на высоконагруженные сервера? G>>Не путай. 10% кода выполняются 90% времени в вычислтеьных задачах. G>>При высоких нагрузках надо оптимально управлять ресурсами. Х>ну вот, пошли уточнения про вычислительные задачи а уж если надо оптимально управлять ресурсами то использовать C++ ето сам бог велел.
И что есть в с++ для управления ресурсами? Наверное хорошый пул потоков или "зеленые" треды? А может там есть выделение памяти в хипе за O(1)?
G>>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего. Х>да что же ты будешь делать, повторяю, три раза: контекст может копироваться, копироваться, копироваться. Х>т.е. в лямбду скопируется значение переменной на стеке Х>для закрепления: Х>копироваться может контекст Х>не только по ссылке а и по значению Х>копироваться Х>контекст Х>по значению Х>запомнил?
Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
Х>>>>>зайди в раздел .NET или .NET GUI и посмотри темы в которых люди кричат о недостаточной производительности, такое ощущение что избавившись от менеджмента памяти дотнетовцы теперь приседают в борьбе за производительность G>>>>Многие проблемы с производительностью от незнания. У меня саого программы на .NET тормозили когда я только начинал на нем писать. Теперь таких проблем нету. Х>>>я рад за тебя что у тебя нет проблемм с производительностью, а в коде над которым я работаю нет утечек памяти, и явные delete можно пересчитать по пальцам, и что? G>>И кто же память освобождает? shared_ptr, так они оверхед создают... Х>ух-хаха, я вообще не использую shared_ptr, представляешь? удивительно, да?
И что же ты используешь?
G>>А вообще-то есть статистика. Так вот проблемы с утечками памяти в unmanaged появляют гораздо чаще проблем с производительностью в managed. Х>есть статистика, что на десктопах пользователей подавляющее большинство приложений — unmanaged, ето на мой взгляд самая лучшая статистика.
Эта статистика очень слабо связана с техническими аспектами. Обсуждали уже сотню раз.
Здравствуйте, COFF, Вы писали:
COF>Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
Это очередной ответ из серии "я ни черта не понимаю о чем там в ветках про .Net, но есть пачка слов, к которым можно прицепиться". Уже утомили.
Здравствуйте, gandjustas, Вы писали:
G>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать)
Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика".
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, MxKazan, Вы писали:
MK>Это очередной ответ из серии "я ни черта не понимаю о чем там в ветках про .Net, но есть пачка слов, к которым можно прицепиться". Уже утомили.
Ага, сейчас ты мне расскажешь про IDisposable :) Плавали, знаем..
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, MxKazan, Вы писали:
MK>>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
ГВ>Примерно то же самое, кстати, должен делать и компилятор C++. Лямбда тоже преобразуется в класс с единственным методом (не считая конструктора копии, кажется) — "operator()(сигнатура, выведенная из параметров лямбды)".
дотнет этот класс распологает изначально в хипе, а C++ на стеке. дотнетчики с классом ассоциируют хип если не оговорено "класс на стеке", что означает структуру в дотнете.
Потому то же самое, но лишь условно примерно.
Здравствуйте, gandjustas, Вы писали:
Х>>запомнил? G>Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую)
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Здравствуйте, gandjustas, Вы писали:
COF>>>Они позволяют реализовывать осмысленные стратегии управления ресурсами, в том числе отличными от памяти. G>>Осмысленное в твоем понимании — ручное?
COF>Осмысленное — это значит сделал один раз и забыл, все работает. А ручное — это как-раз подход C#, присвоил переменную, не забудь вызвать функцию типа SubscribeResource, обнулил — UnsubscribeResource ну и так далее.
А ты на C# писал чтонить сложнее heelo world?
А с асинхронным вводом-выводом работал?
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Вот привели в пример какой-то пост, где с помощью WPF попытались нарисовать туеву хучу объектов. Интересно, на С++ аналогичное вообще заведется? (не говоря о том чтобы поехать) ГВ>Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика".
Не, такие программы на С++ просто не появляются.
Здравствуйте, COFF, Вы писали:
COF>Ага, сейчас ты мне расскажешь про IDisposable Плавали, знаем..
IDisposable сделан для unmanaged-ресурсов, чтобы за вашим, недоступным для GC, багажом следить.
В полностью managed библиотеках он практически не нужен. WPF тому пример.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
G>>Есть переменная на стеке, надо построить честное замыкание для лямбды. Время жизни лямбды больше текущего скоупа. Что С++ предлагает? Ничего.
ГВ>Да ёлки ж зелёные! Значения (синоним в данном контексте: копия переменной) плюсовыми лямбдами замыкаются с лёгкостью неимоверной. А дальше — хоть выводи функцию из скопа, хоть прихлопывай.
Нет. Нужно лексическое замыкание (не копирование значения).
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>>>А замкнуть "по ссылке" их можно? То есть так, чтобы структура "физически" осталась в стеке конструирующей лямбду функции? Или только "по значению", то есть — копированием в соответствующий экземпляр класса сконструированной лямбды? MK>>Я напишу про общий случай, т.к. спецификацию на язык не читал. Так вот, копирования никакого нет. Компилятор превращает лямбду в класс, у которого поля — это замкнутые переменные, а единственный метод — тело (или как там оно называется) лямбды. Все операторы работающие с замкнутой переменной вне лямбды, переписываются на обращение к полю класса.
ГВ>По сути вопроса — понятно. Не знаешь, значит — не знаешь.
Я не знаю только, делает ли компилятор в каких-либо случаях замыкание на стек. А те лямбды, которые я смотрел в Рефлекторе, реализованы именно так, как описано.
Здравствуйте, Геннадий Васильев, Вы писали:
ГВ>Здравствуйте, gandjustas, Вы писали:
Х>>>запомнил? G>>Не надо мне доказывать что нету и не будет в с++ нормальных замыканий, я это и так знаю.
ГВ>Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую)
Не надо такие умные слова говорить. Говори честно — копирование значения. Копирование лексическим замыканием не является.
Здравствуйте, MxKazan, Вы писали:
COF>>Ага, сейчас ты мне расскажешь про IDisposable :) Плавали, знаем.. MK>IDisposable сделан для unmanaged-ресурсов, чтобы за вашим, недоступным для GC, багажом следить. MK>В полностью managed библиотеках он практически не нужен. WPF тому пример.
Хм, из ссылки выше я скорее заключил бы обратное :) Потом, времена когда вся система и все приложения будут работать под одной виртуальной машиной с одним GC пока не наступили, тогда может это и не нужно будет, а пока доступ ко внешним по отношению к данному GC ресурсам — это обычная рутинная задача для любого приложения.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Ясный пень — программы на C++ падают от одного слова: "туева хуча". Заклинание такое, хуже "мемори лика". G>Не, такие программы на С++ просто не появляются.
Во, талантище!
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!
Здравствуйте, COFF, Вы писали:
COF>Хм, из ссылки выше я скорее заключил бы обратное Потом, времена когда вся система и все приложения будут работать под одной виртуальной машиной с одним GC пока не наступили, тогда может это и не нужно будет, а пока доступ ко внешним по отношению к данному GC ресурсам — это обычная рутинная задача для любого приложения.
Да ты не один такой. Вы тут многие свои оригинальные выводы делаете. Всё от того, что на .Net никто не пишет и смотрит на обсуждение с позиции "к чему бы придраться". Если бы ты почитал внимательно, то увидел бы, что спор идет против втаскивания наследия (unmanaged)WinForms в WPF. Мне еще не разу не понадобился IDisposable, хотя уже 7 месяцев работаю над приложением на WPF, и контролы писал и шаблоны ваял и много много еще чего.
Здравствуйте, gandjustas, Вы писали:
ГВ>>Итак: "лямбды в C++ предусматривают возможность замыкания контекста по значению". Твой ответ? (Бис! Бис! Заранее аплодирую) G>Не надо такие умные слова говорить. Говори честно — копирование значения. Копирование лексическим замыканием не является.
Расскажи это лисперам. В лиспе исторически замыкания создавались копированием используемых переменных.
Я знаю только две бесконечные вещи — Вселенную и человеческую глупость, и я не совсем уверен насчёт Вселенной. (c) А. Эйнштейн
P.S.: Винодельческие провинции — это есть рулез!