Я только что прочитал классическую книгу «Эффективный C++, 3-е издание», а в пункте 20 автор приходит к выводу, что встроенные типы, STL-итераторы и типы объектов функций - подходит для передачи по значению. Я вполне мог понять причину для типов встроенных и итераторов, но Почему объекту функции должно быть передаточное значение, так как мы знаем, что это классный тип?Почему объекты функции должны быть переданы по значению
ответ
В типичном случае объект функции будет иметь мало или (чаще) отсутствие постоянного состояния. В таком случае передача по значению может вообще не требовать передачи чего-либо вообще - переданное «значение» в основном мало или не что иное, как местозаполнитель для «это объект».
Учитывая небольшой объем кода во многих функциональных объектах, это приводит к дальнейшей оптимизации: для компилятора довольно легко расширять код для встроенного объекта функции, поэтому параметры не передаются, и никакой вызов функции не является вообще.
Компилятор может иметь возможность сделать то же самое, когда вы передаете указатель или ссылку вместо этого, но это не так просто - гораздо более распространено то, что вы в конечном итоге создадите объект, его адрес и затем оператор вызова функции для этого объекта вызывается через этот указатель.
Редактировать: Возможно, также стоит упомянуть, что то же самое относится к лямбдам, так как они действительно просто маскируют объекты функции. Вы не знаете имя класса, но создаете класс в непосредственной близости от области действия, которая перегружает оператор вызова функции, и это то, что вызывается при вызове лямбда. [Спасибо @Mark Garcia.]
Спасибо за ваше объяснение, а часть «встроенная оптимизация» впечатляет меня. – JavaBeta
Мой опыт работы показывает, что широкое использование 'boost :: bind' приводит к функциям объектов, которые дорого копировать. Он, по-видимому, увеличивается экспоненциально по глубине связывания (привязка обратного вызова, который имеет связанный обратный вызов внутри и т. Д.) –
От Effective STL (с тех пор, как вам кажется, Скотт Мейерс) item 38 Классы классов функций для пропущенных значений.
«В обоих указателях функций C и C++ передаются по значению. Объекты STL-функции моделируются после указателей функций, поэтому соглашение в STL также означает, что объекты функции передаются по значению при передаче в и из функций. "
Это имеет некоторые преимущества и некоторые последствия, такие как @Jerry Coffin, компилятор может сделать некоторые оптимизации, такие как встроенный код, чтобы избежать вызовов функций (вы должны отметить свой функтор как встроенный). Хорошим примером этого случая является сравнение производительности qsort vs std :: sort, где std :: sort с использованием встроенных функторов превосходит qsort на много, вы можете найти дополнительную информацию об этом на Effective STL, где он широко обсуждается и упоминается в нескольких главы.
Это также имеет несколько последствий, поскольку объекты функций передаются и возвращаются по значению, вы должны убедиться, что у вашего объекта есть четко определенные механизмы копирования, небольшие по размеру (в противном случае это может стать дорогостоящим) и являются мономорфными (поскольку передача полиморфных объектов по значению может привести к разрезанию объектов).
Эффективная серия Meyers очень популярна в Китае :-). Кроме того, спасибо за объяснение различия между std :: sort и std :: qsort. – JavaBeta
Причина № 1 для передачи объектов функции по значению состоит в том, что стандартная библиотека требует, чтобы объекты функций, которые вы передаете своим алгоритмам, можно было копировать. C++ 11 §25.1/10:
[Примечание: Если не указано иное, алгоритмы, которые принимают объекты функции в качестве аргументов разрешено копировать те функциональные объекты свободно. Программисты, для которых важна идентичность объекта, должны рассмотреть возможность использования класса-оболочки , который указывает на объект не поддающейся обработке объекта, такой как
reference_wrapper<T>
(20.8.3), или какое-то эквивалентное решение.Примечание]
Другие ответы прекрасно объясняют обоснование.
- 1. Только переменные должны быть переданы по ссылке
- 2. Функции в js скопированы/переданы по значению или ссылке
- 3. Являются ли пользовательские объекты переданы по значению или переданы по ссылке в фрагментах и действиях.?
- 4. Должны быть переданы байты заполнения в glteximage2d
- 5. Какие аргументы должны быть переданы .show()?
- 6. только переменные должны быть переданы по ссылке, базы данных/DB_active_rec.php
- 7. Многопроцессор Python и список переменных, которые должны быть переданы функции
- 8. Аргументы переданы методам по ссылке или значению?
- 9. Объекты PHP5 переданы по ссылке?
- 10. Как исправить ошибку «Только переменные должны быть переданы по ссылке»
- 11. PHP Строгие стандарты: только переменные должны быть переданы по ссылке
- 12. только переменные должны быть переданы по ссылке в PHP
- 13. Строгие стандарты: только переменные должны быть переданы по ссылке
- 14. Strct стандарты: только переменные должны быть переданы по ссылке
- 15. PHP - Строгие стандарты: только переменные должны быть переданы по ссылке
- 16. только переменные должны быть переданы по ссылке .. Нужна помощь :) (PHP)
- 17. PHP Строгие стандарты: только переменные должны быть переданы по ссылке
- 18. Строгие стандарты: только переменные должны быть переданы по ссылке
- 19. «Строгие стандарты: только переменные должны быть переданы по ссылке» ошибка
- 20. Почему объекты в Redux должны быть неизменными?
- 21. Модели и объекты доступа к данным, которые должны быть переданы и что должно быть передано
- 22. Почему функции CouchDB Reduce должны быть коммутативными?
- 23. В какой форме должны быть переданы данные на View?
- 24. Почему я получаю эту ошибку «Только переменные должны быть переданы по ссылке» с PHP?
- 25. Почему я получаю сообщение об ошибке «Только переменные должны быть переданы по ссылке»?
- 26. arrayWithObjects: Объекты должны быть NSStrings
- 27. Объекты должны быть типа PHAsset
- 28. Соглашения об архитектуре API RESTful: как должны быть переданы параметры
- 29. Аргументы, которые должны быть переданы команде AT-AT в ar.drone
- 30. Где должны быть переданы объекты передачи данных (DTO) в многоуровневом приложении с использованием DDD
+1 для чтения Эффективный C++ – Borgleader
Функциональные объекты редко должны иметь большие накладные расходы. – chris
По крайней мере, это более логично (все объекты, в общем) теперь, когда есть семантика перемещения. –