Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> способ применения User-defined Literals? 
V
    Опции темы
newbee
Дата 9.11.2011, 19:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  19:19 Найти цитируемый пост)
newbee, функтор может быть вызван не в контексте его создания, а гораздо позже.. 
Это конечно так и так и должно быть. Но я сейчас начала тестировать.... Если я ничего не напутала, это какие-то неуклюжие, неполноценные и вообще бесполезные замыкания, работающие на стеке. Самый примитивный пример: функция foo, в ней объявлена какая-нибудь переменная xx (пусть она даже придет в качестве аргумента foo - не суть), она возвращает две лямбды: одна увеличивает xx, вторая возвращает текущее значение xx. Вот пример на лиспе:

Код

(defun foo (xx)
 (list                           ; возвращаем список из двух лямбд
  (lambda () xx)                 ; первая возвращает xx
  (lambda (a) (incf xx a))))     ; вторая увеличивает xx на переданный параметр

(setq l (foo 42))                ; вызываем фу и сохраняем результат в переменную l

(funcall (first l))              ; вызываем первую лямбду
  -> 42

(funcall (second l) -12)         ; вызываем вторую лямбду

(funcall (fist l))               ; и снова первую
  -> 30


Вот это настоящее замыкание. Теперь то, как я пыталсь воспроизвести такое поведение на С++:

Код

#include<functional>
#include<iostream>

struct two_lm{
 std::function<int(int)> l1,l2;
};

two_lm foo(){
 int xx=42;
 two_lm tt;
 tt.l1=[&](int a){xx+=a;return xx;}; // если тут сделать [=], не скомпилится
 tt.l2=[=](int a){return xx;};       // если тут поставить [&], возвращать всегда будет ноль (а может ваще упадет, хз)
 return tt;}


int main(){
 two_lm lm=foo();
 std::cout<<lm.l2(0)<<std::endl;
 lm.l1(-2);
 std::cout<<lm.l2(0)<<std::endl;
 return 0;}


Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие!


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 19:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



с [&] обе лямбды будут ссылаться не на свои данные,
в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе

Добавлено через 1 минуту и 47 секунд
Цитата(newbee @  9.11.2011,  18:02 Найти цитируемый пост)
вторая увеличивает xx на переданный параметр

за время жизни захваченной по ссылке отвечает программист

Добавлено через 5 минут и 53 секунды
Цитата(newbee @  9.11.2011,  18:02 Найти цитируемый пост)
Умоляю, скажите, что я что-то сделала не так, и замыкания в С++ настоящие! 

замкнули стековую переменную.. С++ императивный язык..



--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 19:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
с [&] обе лямбды будут ссылаться не на свои данные,
в первом случае с [=] ругается из за того что пытаетесь изменить рвалуе
Ну это понятно.

Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
за время жизни захваченной по ссылке отвечает программист 
То есть замыканий в С++ не появилось. Я все больше разочаровываюсь в новом С++.

Цитата(mes @  9.11.2011,  20:10 Найти цитируемый пост)
замкнули стековую переменную.. С++ императивный язык..
И что? Это же не надстройка над ассемблером, компилятор должен выделить эту переменную в некоторый контекст и, когда все пользователи контекста исчезнут, освободить его. Программист может сам сэмулировать такое поведение, сохранив "замкнутые" переменные в каком-нибудь объекте и таская ссылку/указатель на него между функциями, но это все отстой.


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 19:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



newbee
1. С++ не делает того что непросит пользователь, особенно если касается данных.. 
2. для таких случаев есть shared_ptr..

Добавлено через 1 минуту и 11 секунд
Цитата(newbee @  9.11.2011,  18:26 Найти цитируемый пост)
, но это все отстой. 

а вот это в точку smile для нормальности, ох сколько ему еще надо пройти..
но в сравнение с тем что было, с++ стал просто ангелом smile



--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.11.2011, 20:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(newbee @  9.11.2011,  19:26 Найти цитируемый пост)
компилятор должен выделить эту переменную в некоторый контекст и, когда все пользователи контекста исчезнут, освободить его.

так и будет, когда реализуют GC. это в текущем стандарте, так что 8 лет ждать не придется smile 
PM WWW   Вверх
mes
Дата 9.11.2011, 21:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(boostcoder @  9.11.2011,  19:39 Найти цитируемый пост)
так и будет, когда реализуют GC

имхо, GC не поможет захватить стековую переменную..


--------------------
PM MAIL WWW   Вверх
boostcoder
Дата 9.11.2011, 21:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



Цитата(mes @  9.11.2011,  21:00 Найти цитируемый пост)
GC не поможет захватить стековую переменную

доку целиком не читал, но полагаю, само понимание стековых переменных изменится.
PM WWW   Вверх
boostcoder
Дата 9.11.2011, 21:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



хотя...мне тут подсказывают, что GC может быть вовсе исключен уже после утверждения стандарта.
PM WWW   Вверх
newbee
Дата 9.11.2011, 21:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  9.11.2011,  21:39 Найти цитируемый пост)
так и будет, когда реализуют GC. это в текущем стандарте, так что 8 лет ждать не придется
Не нужен для этого сложный GC. Тут тривиальный подсчет ссылок, который можно воткнуть прямо в компилятор. С каждой лямбдой, созданной в данном контексте ассоциируется счетчик контекста, когда все лямбды будут уничтожены, контекст может смело очищаться. Между контекстами даже циклических зависимостей не бывает.

Цитата(mes @  9.11.2011,  22:00 Найти цитируемый пост)
имхо, GC не поможет захватить стековую переменную.. 
Что ты все за стек переживаешь, компилятор просто не кладет замкнутую переменную на стек, кроме случаев, когда замыкание гарантированно не вылезет за пределы функции.

Цитата(mes @  9.11.2011,  20:39 Найти цитируемый пост)
но в сравнение с тем что было, с++ стал просто ангелом 
Ну лично я вижу больше синтаксического мусора, чем достоинств. Не думаю, что программисты станут массово изучать язык, с таким вектором развития путь у него только в могилу, к сожалению.


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 21:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
компилятор просто не кладет замкнутую переменную на стек

смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. 
если добавят в с++ gc, то gc-указатели будут иметь свой синтаксис.. 

Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
ут тривиальный подсчет ссылок

Цитата(mes @  9.11.2011,  18:39 Найти цитируемый пост)
shared_ptr..


Цитата(newbee @  9.11.2011,  20:34 Найти цитируемый пост)
. Не думаю, что программисты станут массово изучать язык

я рассказывал с точки зрения облегчения труда программиста, который уже знает С++




--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 21:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  22:41 Найти цитируемый пост)
смотря какие компиляторы.. В примере который написан выше захват идет именно стековой переменной.. 
Разве в стандарте С++ говорится, что переменная, объявленная в функции, должна лежать на стеке? Да даже если и так, могли изменить этот пунктик, все равно новый стандарт выпускали.  Программисту ведь вообще до балды, где располагается переменная, ему достаточно знать, что после выхода из функции она уничтожится[, если только не попала в замыкание].

Цитата(mes @  9.11.2011,  22:41 Найти цитируемый пост)
shared_ptr..
А чего мелочиться, можно даже ООП на си построить (GObject) и вручную с ним ковыряться. Чем больше компилятор умеет делать сам, тем лучше, тем быстрее работает программа, тем меньше в ней ошибок и тем понятнее ее исходный код. Смотри, например на с++ средствами ООП можно кривенько и неудобненько эмулировать замыкания. И наоборот, в любом языке, умеющим замыкания, можно эмулировать ООП, даже примитивов вроде "структура" не нужно. Но это же все костыли и подпорки, язык сам должен уметь такие вещи.


--------------------
You're face to face
With man who sold the world
PM   Вверх
mes
Дата 9.11.2011, 22:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


Профиль
Группа: Участник Клуба
Сообщений: 7954
Регистрация: 14.1.2006

Репутация: 144
Всего: 250



Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
что после выхода из функции она уничтожится

вот именно..  это для тривиальных не важно где и когда уничтожатся.. но есть множество объектов которых просто нельзя замыкать без разрешения пользователя..

Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
А чего мелочиться, можно даже ООП на си построить

Цитата(newbee @  9.11.2011,  20:56 Найти цитируемый пост)
 язык сам должен уметь такие вещи. 

кто то спорит с этим ? должен, но у с++ другая идеология и пока подобное не возможно.. 
я объясняю лишь почему это на текущий момент нельзя... 


--------------------
PM MAIL WWW   Вверх
newbee
Дата 9.11.2011, 22:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(mes @  9.11.2011,  23:04 Найти цитируемый пост)
вот именно..  это для тривиальных не важно где и когда уничтожатся.. но есть множество объектов которых просто нельзя замыкать без разрешения пользователя..
Что например нельзя замыкать? Без какого разрешения? Программист сам создает замыкание с определенными переменными, засунув их в лямбду. Вот тебе и разрешение.

Это сообщение отредактировал(а) newbee - 9.11.2011, 22:11


--------------------
You're face to face
With man who sold the world
PM   Вверх
boostcoder
Дата 9.11.2011, 22:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


pattern`щик
****


Профиль
Группа: Завсегдатай
Сообщений: 5458
Регистрация: 1.4.2010

Репутация: 49
Всего: 110



сейчас напишу девелоперам GCC с вопросом о ситуации приведенной newbee. ведь по логике, получается правильно, если переменная попадает в список захвата, то компилятор изначально должен ее размещать не на стеке(в прямом понимании).

Добавлено через 8 минут и 17 секунд
Цитата(boostcoder @  9.11.2011,  22:12 Найти цитируемый пост)
сейчас напишу девелоперам GCC

хм.. а есть ли смысл?
PM WWW   Вверх
newbee
Дата 9.11.2011, 22:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бревно
**


Профиль
Группа: Участник
Сообщений: 703
Регистрация: 24.8.2011

Репутация: 4
Всего: 19



Цитата(boostcoder @  9.11.2011,  23:12 Найти цитируемый пост)
хм.. а есть ли смысл? 
Неа. Пиши сразу Страуструпу smile



--------------------
You're face to face
With man who sold the world
PM   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1211 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.