![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Привет всем
Курю тут потихоньку Майерса, ЭФфективный STL и наблюдаю тот факт что он сует функторы где-бы не попало. Аргументируя следующим: 1. Когда рак на горе свистнет то может придеться добавлять дополнительные параметры (правда тут спокойно используеться bind1,2st или вообще boost). 2. Компилятору проще про-инлайнить оператор () чем функцию. У меня на это есть следующие возражения: 1. А если по дизайну запрещено добавлять новые параметры? 2. А если ин-лайн функцией в класс? 3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор? А тут ещё Александреску грозиться вешать всех кто пишет жуткие классы вместо двух-строчного for Может я чего-то упустил? Что вы используете? --------------------
|
|||
|
||||
| DeadSoul |
|
|||
|
Эксперт ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 1217 Регистрация: 25.9.2005 Где: Москва Репутация: 2 Всего: 11 |
Нет. не говорит. -------------------- Если Вы получили ответ на Ваш вопрос, то нажмите на "Вопрос решен". Бьем спамеров их же оружием. Пусть весь спам сыпется им [email protected] |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
Мне пару раз приходилось использовать и то, и то. Функция, по мне, все-таки читабельней...
|
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator()
значит не надо никакой обобщенности, в принципе не планируется ничего по ходу дела добавлять, можно пользоваться обычными ф-ями/методами по поводу читабельности по мне так одинаково, вызов функтора так вообще ничем не отличается от вызова ф-ии -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Earnest |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5962 Регистрация: 17.6.2005 Где: Рязань Репутация: 53 Всего: 183 |
Сначала надо потренироваться - везде писать функторы, где хотя бы принципиально можно. Чтобы мозги привыкли в эту сторону думать.
Потом успокоиться и писать как нравится - как кажется более читабельным. Я пишу по разному. Иногда, если действие хорошо локализуется, и нужно выполнить ряд таких действий в функции, лучше выглядят функторы + алгоритмы:
Комментарии можно не писать... А если заменить это дело циклами - будет хуже читаться. Но иногда действие сложное, со сквозными переменными, или в функтор слишком много параметров передать нужно, или еще что - тогда проще функцией сделать... -------------------- ... |
|||
|
||||
| chipset |
|
||||||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Я всё больше к этому прихожу и стараюсь использовать transform, for_each, remove_copy и прочие везде где это только возможно без особого затруднения чтения. ИМХО, for'ы и while'ы не настолько читабельны. Просто в них можно использовать как свободные функции так и функторы, афаик.
Поэтому я и задал такой вопрос --------------------
|
||||||||
|
|||||||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее
-------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| zss |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 708 Регистрация: 17.6.2004 Репутация: 1 Всего: 2 |
Тот же Мейерс приводит убедительные доказательства по производительности в пользу функтора Как он говорит прирост достигал 160% на некоторых платформах и подробно объяснил это (где-то уже под конец) |
|||
|
||||
| Daevaorn |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 2155 Регистрация: 29.11.2004 Где: Москва Репутация: 51 Всего: 70 |
Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние. И от итерации к итерации, от алгоритма к алгоритму менять своё поведение. Согласитесь, что иногда очень полезно. Нет, конечно, это можно сделать и свободными функциями с использованием статических переменный, но это менее удобно, и как говориться, ухудшает дизайн.
|
|||
|
||||
| chipset |
|
||||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
Компилятор инлайнит оператор скобки.
Я это понимаю. В начале топика, я упоминал ту ситуацию когда ему НЕ НАДО хранить своё состояние --------------------
|
||||
|
|||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
очень даже не факт, компиляторов-то много -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Void |
|
|||
![]() λcat.lolcat ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 2206 Регистрация: 16.11.2004 Где: Zürich Репутация: 40 Всего: 173 |
С компилятором, не способным инлайнить хотя бы простейшие функции, использование половины алгоритмов STL теряет смысл. Почти в тему: вот тут — proposal комитета по введению в C++ полноценных анонимных функций (aka лямбда-функций). Предложение исходит (в том числе) от самого Страуструпа и автора Boost.Lambda. Помнится, долгие дискуссии в c.l.c++.m сводились к тому, что нормально реализовать это не удастся, однако ж… -------------------- “Coming back to where you started is not the same as never leaving.” — Terry Pratchett |
|||
|
||||
| chipset |
|
|||
|
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 4071 Регистрация: 11.1.2003 Где: Seattle, US Репутация: 27 Всего: 165 |
На самом деле boost это уже "второй STL"
--------------------
|
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |