| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > Функторы vs свободные функции |
| Автор: chipset 1.3.2006, 23:46 |
| Привет всем Курю тут потихоньку Майерса, ЭФфективный STL и наблюдаю тот факт что он сует функторы где-бы не попало. Аргументируя следующим: 1. Когда рак на горе свистнет то может придеться добавлять дополнительные параметры (правда тут спокойно используеться bind1,2st или вообще boost). 2. Компилятору проще про-инлайнить оператор () чем функцию. У меня на это есть следующие возражения: 1. А если по дизайну запрещено добавлять новые параметры? 2. А если ин-лайн функцией в класс? 3. А не будет ли это менее читабельнее, все-таки новый класс подсознательно говорит читателю о том что это класс а не функтор? А тут ещё Александреску грозиться вешать всех кто пишет жуткие классы вместо двух-строчного for Может я чего-то упустил? Что вы используете? |
| Автор: JackYF 2.3.2006, 06:07 |
| Мне пару раз приходилось использовать и то, и то. Функция, по мне, все-таки читабельней... |
| Автор: MAKCim 2.3.2006, 08:30 |
| само понятие функтор - обобщение функции/процедуры/метода/любой сущности к которой применяется operator() значит не надо никакой обобщенности, в принципе не планируется ничего по ходу дела добавлять, можно пользоваться обычными ф-ями/методами по поводу читабельности по мне так одинаково, вызов функтора так вообще ничем не отличается от вызова ф-ии |
| Автор: Earnest 2.3.2006, 15:51 | ||
| Сначала надо потренироваться - везде писать функторы, где хотя бы принципиально можно. Чтобы мозги привыкли в эту сторону думать. Потом успокоиться и писать как нравится - как кажется более читабельным. Я пишу по разному. Иногда, если действие хорошо локализуется, и нужно выполнить ряд таких действий в функции, лучше выглядят функторы + алгоритмы:
Комментарии можно не писать... А если заменить это дело циклами - будет хуже читаться. Но иногда действие сложное, со сквозными переменными, или в функтор слишком много параметров передать нужно, или еще что - тогда проще функцией сделать... |
| Автор: chipset 3.3.2006, 01:23 | ||||||
Я всё больше к этому прихожу и стараюсь использовать transform, for_each, remove_copy и прочие везде где это только возможно без особого затруднения чтения. ИМХО, for'ы и while'ы не настолько читабельны. Просто в них можно использовать как свободные функции так и функторы, афаик.
Поэтому я и задал такой вопрос |
| Автор: MAKCim 3.3.2006, 08:35 |
| впринципе, если разобраться то все-таки вызов функтора - менее производителен, т. к вызов ф-ии/метода...происходит после вызова operator(), двойной вызов происходит не всегда (например предикаты), но обычно происходит и наверное это медленнее |
| Автор: zss 3.3.2006, 10:19 | ||
Тот же Мейерс приводит убедительные доказательства по производительности в пользу функтора Как он говорит прирост достигал 160% на некоторых платформах и подробно объяснил это (где-то уже под конец) |
| Автор: Daevaorn 3.3.2006, 10:41 |
| Ну у функтора есть ряд преимуществ. Он, допустим, может сохранять некое своё состояние. И от итерации к итерации, от алгоритма к алгоритму менять своё поведение. Согласитесь, что иногда очень полезно. Нет, конечно, это можно сделать и свободными функциями с использованием статических переменный, но это менее удобно, и как говориться, ухудшает дизайн. |
| Автор: chipset 3.3.2006, 11:14 | ||||
Компилятор инлайнит оператор скобки.
Я это понимаю. В начале топика, я упоминал ту ситуацию когда ему НЕ НАДО хранить своё состояние |
| Автор: MAKCim 3.3.2006, 20:11 | ||
очень даже не факт, компиляторов-то много |
| Автор: Void 3.3.2006, 20:59 |
| С компилятором, не способным инлайнить хотя бы простейшие функции, использование половины алгоритмов STL теряет смысл. Почти в тему: вот http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2006/n1968.pdf — proposal комитета по введению в C++ полноценных анонимных функций (aka лямбда-функций). Предложение исходит (в том числе) от самого Страуструпа и автора Boost.Lambda. Помнится, долгие дискуссии в c.l.c++.m сводились к тому, что нормально реализовать это не удастся, однако ж… |
| Автор: chipset 6.3.2006, 03:41 |
| На самом деле boost это уже "второй STL" |