Передача аргумента в функцию по значению или по ссылке?
Изучая С++ заметил, что авторы статей/книг не рекомендуют передавать значения примитивных типов по ссылке. Расскажите, пожалуйста, как лучше поступать и почему?
Мои догадки, почему лучше использовать передачу по значению: на создание параметра-ссылки уходит в 2 раза больше памяти, бывает необходимо менять значение параметра без влияния на переменную-аргумент caller'а.
Ответы (1 шт):
Можно работать и так, и так. Работа со ссылкой означает, что где-то там за сценой получается адрес очередного элемента, и при работе с этим элементом выполняется разыменование. По значению - что выполняется копирование.
А потому надо смотреть, что именно вам нужно - например, если вы хотите изменять элементы в массиве, то нужно работать по ссылке. Если, наоборот, вы хотите изменять содержимое переданного аргумента, но при этом хотите, чтобы это не отразилось на исходной переменной - работайте по значению. Если ситуация допускает и тот, и иной вариант - стоит посмотреть, какая операция - разыменования (возможно, не одна) или копирования - обойдется дороже. Для простых типов небольшого размера копирование, как правило, дешевле. Но вообще говоря - тут надо даже не смотреть на конкретный код, а профилировать его - если, конечно, оно того стоит с точки зрения оптимизации.
И не забывайте, что можно использовать еще и константную ссылку :) Потому что передача по ссылке автоматически требует наличия lvalue, так что функцию f(int&); вы как f(5); не вызовите...
"По-моему, так" (с) Пух