Существует два основных соображения. Один из них - это расход копирования переданного объекта, а второй - предположения, которые компилятор может сделать, когда объект является локальным объектом.
E.g. В первом виде в теле f
нельзя предположить, что a
и b
не ссылаются на один и тот же объект; поэтому значение a
должно быть перечитано после любой записи до b
, на всякий случай. Во второй форме a
не может быть изменен посредством записи на b
, так как он является локальным для функции, поэтому эти повторные чтения не нужны.
void f(const Obj& a, Obj& b)
{
// a and b could reference the same object
}
void f(Obj a, Obj& b)
{
// a is local, b cannot be a reference to a
}
E.g.: В первом примере компилятор может предположить, что значение локального объекта не изменяется при выполнении несвязанного вызова. Без информации о h
компилятор может не знать, не изменяется ли объект, с которым эта функция ссылается (через ссылочный параметр), на h
. Например, этот объект может быть частью глобального состояния, которое изменяется на h
.
void g(const Obj& a)
{
// ...
h(); // the value of a might change
// ...
}
void g(Obj a)
{
// ...
h(); // the value of a is unlikely to change
// ...
}
К сожалению, этот пример не является чугуном. Можно написать класс, который, скажем, добавляет указатель на себя к объекту глобального состояния в его конструкторе, так что даже локальный объект типа класса может быть изменен глобальным вызовом функции. Несмотря на это, все еще есть потенциально больше возможностей для правильной оптимизации для локальных объектов, поскольку они не могут быть сглажены напрямую с помощью ссылок, переданных или других ранее существовавших объектов.
Передача параметра на const
Следует выбирать ссылку, где требуется семантика ссылок, или как улучшение производительности, только если стоимость потенциального сглаживания будет перевешиваться за счет копирования параметра.
Возможный дубликат http://stackoverflow.com/questions/1567138/const-t-arg-vs-t-arg –
Ссылки на gf статьи ссылаются на ваш второй вопрос. Короче: если вам нужна копия, то передайте ее. –
@ Кирилл Ах, это ответ на мой вопрос. Я искал «pass by const reference», и он ничего не менял, поэтому я пропустил это. – Maulrus