![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
newbee |
|
||||||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Вот это настоящее замыкание. Теперь то, как я пыталсь воспроизвести такое поведение на С++:
Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие! -------------------- You're face to face With man who sold the world |
||||||
|
|||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
с [&] обе лямбды будут ссылаться не на свои данные,
в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе Добавлено через 1 минуту и 47 секунд за время жизни захваченной по ссылке отвечает программист Добавлено через 5 минут и 53 секунды
замкнули стековую переменную.. С++ императивный язык.. |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
То есть замыканий в С++ не появилось. Я все больше разочаровываюсь в новом С++. И что? Это же не надстройка над ассемблером, компилятор должен выделить эту переменную в некоторый контекст и, когда все пользователи контекста исчезнут, освободить его. Программист может сам сэмулировать такое поведение, сохранив "замкнутые" переменные в каком-нибудь объекте и таская ссылку/указатель на него между функциями, но это все отстой. -------------------- You're face to face With man who sold the world |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
newbee,
1. С++ не делает того что непросит пользователь, особенно если касается данных.. 2. для таких случаев есть shared_ptr.. Добавлено через 1 минуту и 11 секунд а вот это в точку ![]() но в сравнение с тем что было, с++ стал просто ангелом ![]() |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
имхо, GC не поможет захватить стековую переменную.. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
доку целиком не читал, но полагаю, само понимание стековых переменных изменится. |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
хотя...мне тут подсказывают, что GC может быть вовсе исключен уже после утверждения стандарта.
|
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Что ты все за стек переживаешь, компилятор просто не кладет замкнутую переменную на стек, кроме случаев, когда замыкание гарантированно не вылезет за пределы функции. Ну лично я вижу больше синтаксического мусора, чем достоинств. Не думаю, что программисты станут массово изучать язык, с таким вектором развития путь у него только в могилу, к сожалению. -------------------- You're face to face With man who sold the world |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. если добавят в с++ gc, то gc-указатели будут иметь свой синтаксис.. я рассказывал с точки зрения облегчения труда программиста, который уже знает С++ |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
А чего мелочиться, можно даже ООП на си построить (GObject) и вручную с ним ковыряться. Чем больше компилятор умеет делать сам, тем лучше, тем быстрее работает программа, тем меньше в ней ошибок и тем понятнее ее исходный код. Смотри, например на с++ средствами ООП можно кривенько и неудобненько эмулировать замыкания. И наоборот, в любом языке, умеющим замыкания, можно эмулировать ООП, даже примитивов вроде "структура" не нужно. Но это же все костыли и подпорки, язык сам должен уметь такие вещи. -------------------- You're face to face With man who sold the world |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 144 Всего: 250 |
вот именно.. это для тривиальных не важно где и когда уничтожатся.. но есть множество объектов которых просто нельзя замыкать без разрешения пользователя.. кто то спорит с этим ? должен, но у с++ другая идеология и пока подобное не возможно.. я объясняю лишь почему это на текущий момент нельзя... |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
Это сообщение отредактировал(а) newbee - 9.11.2011, 22:11 -------------------- You're face to face With man who sold the world |
|||
|
||||
boostcoder |
|
|||
![]() pattern`щик ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 5458 Регистрация: 1.4.2010 Репутация: 49 Всего: 110 |
сейчас напишу девелоперам GCC с вопросом о ситуации приведенной newbee. ведь по логике, получается правильно, если переменная попадает в список захвата, то компилятор изначально должен ее размещать не на стеке(в прямом понимании).
Добавлено через 8 минут и 17 секунд хм.. а есть ли смысл? |
|||
|
||||
newbee |
|
|||
![]() Бревно ![]() ![]() Профиль Группа: Участник Сообщений: 703 Регистрация: 24.8.2011 Репутация: 4 Всего: 19 |
-------------------- You're face to face With man who sold the world |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |