Недостатки передачи функций? - PullRequest
5 голосов
/ 11 мая 2011

Я изучаю C ++ (из Java) и недавно обнаружил, что вы можете передавать функции.Это действительно круто, и я думаю, что это очень полезно.Теперь я думал о том, как я мог бы использовать это, и одна из идей, которая пришла мне в голову, была полностью настраиваемым классом.

Лучшим примером моего череды для полностью настраиваемых классов (кода) будет, скажем, индивидуальный класс.Person будет иметь все функции, относящиеся к P. Позже Person может взять меч (S), поэтому теперь Person имеет доступ ко всем функциям, относящимся как к P, так и к S.

Есть ли ограничения или проблемы с производительностью?Это небрежно и просто нахмурилось?

Любое понимание является образовательным, спасибо.

~ Aedon

Ответы [ 3 ]

4 голосов
/ 11 мая 2011

При передаче функций - то есть указателей на функции - вызовы всегда являются косвенными и, следовательно, могут быть медленнее, чем прямой вызов (и определенно медленнее, чем встроенный вызов).

STL моделируется с помощью функторы .То есть: легкие функциональные объекты, у которых есть член operator (), который вызывается.Это имеет то преимущество, что является очень вероятным кандидатом для встраивания, особенно если функтор и operator() очень просты (например, std::less<T>).

См. Также: http://www.sgi.com/tech/stl/functors.html

2 голосов
/ 11 мая 2011

Нет абсолютно ничего плохого в передаче функции, но она довольно примитивна и ограничена.Часто у вас есть некоторые данные, которые вы хотите связать с функцией, в дополнение к параметрам, которые вы ей передаете.Также вы можете сгруппировать связанные функции и передать их как одну.Поздравляем, вы только что описали класс C ++!

Если вы хотите увидеть, как C ++ действительно может размыть линию, рассмотрим функтор.Этот класс имеет метод operator(), поэтому вы можете вызывать его так же, как функцию.Он имеет два непосредственных преимущества перед простой функцией: он может хранить состояние между вызовами и может быть встроен компилятором для превосходной производительности.Например, std::sort нередко превосходит более старый C qsort, потому что qsort использует указатель на функцию, а std::sort использует функтор.

2 голосов
/ 11 мая 2011

Наблюдается небольшое снижение производительности, поскольку перед вызовом функции необходимо разыменовать указатель или ссылку.

Это очень полезная функция.Многие шаблоны проектирования и полиморфизм зависят от указателей на функции.Проверьте «Шаблон дизайна посетителя».

Другое использование для таблицы функций.Например, вы можете написать общий механизм меню, который отображает разные меню, используя разные функции.

Также исследуйте «Шаблон проектирования фабрики».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...