Для легких типов, то есть тех, которые вписываются в регистр, например int
, это не имеет никакого значения, поскольку их так же легко скопировать, как указатель на них. На самом деле, дополнительная косвенность может навредить производительности, поэтому вам следует избегать ее, если это не нужно.
Однако используемые типы могут быть дорогими для копирования. Пример каждый день - std::string
. Ссылки избегают копий и предпочитаются везде, где функция требует «тяжелых» объектов.
В шаблонах функций обычно следует использовать ссылки при использовании различных типов объектов, если только вы не уверены, что только такие типы являются «легкими», такими как итераторы или скаляры.
Тем не менее, существуют менее очевидные исключения из этого правила.Рассмотрим std::accumulate
:
template< class InputIt, class T >
T accumulate(InputIt first, InputIt last, T init);
Здесь init
принимается значение. Причина довольно проста: в обычных реализациях init
изменен как есть непосредственно Используется внутри вычислений - не вводится промежуточный объект.
template<class InputIt, class T>
T accumulate(InputIt first, InputIt last, T init)
{
for (; first != last; ++first) {
init = init + *first; // Here
}
return init;
}
Указатели не должны использоваться для косвенных функциональных параметров. Они используются в C, где ссылок не существует.
У вас есть случай, когда кто-то это делает? Это, конечно, не «легче» (и «int' не являются »объектами»). – Thilo
Для полноты вы должны добавить принятие 'const &' и '&&'. – Deduplicator
Вам нужно предоставить больше контекста. –