Общее правило на современных процессорах: «математика - это быстро, память - медленно».
Если вы говорите о C ++, передавая целые числа, числа с плавающей запятой и даже небольшие объекты по значению скорее всего будет быстрее.Передача по ссылке может предотвратить различные оптимизации компилятора благодаря псевдонимам.
Для более крупных объектов передача по ссылке будет быстрее.(Определенно, не клонируйте их, потому что память медленная.)
Реальный ответ на этот вопрос, тем не менее, состоит в том, чтобы написать свой код естественным и простым способом, и не беспокойтесь о подобных вопросах, покаваш профилировщик говорит вам:
[обновить, чтобы уточнить проблему алиасинга]
Например, рассмотрим следующие две функции:
void
foo1(int a, int b, int &c, int &d)
{
c = a + b;
d = a - b;
}
void
foo2(const int &a, const int &b, int &c, int &d)
{
c = a + b;
d = a - b;
}
С включенной оптимизацией,мой компилятор (gcc 4.5.2, x86_64) производит этот код для foo1:
leal (%rsi,%rdi), %eax
subl %esi, %edi
movl %eax, (%rdx)
movl %edi, (%rcx)
ret
... и это для foo2:
movl (%rsi), %eax
addl (%rdi), %eax
movl %eax, (%rdx)
movl (%rdi), %eax
subl (%rsi), %eax
movl %eax, (%rcx)
ret
Ваш компилятор сделает что-то подобное.Проблема в том, что в foo2 «c» или «d» могут ссылаться на ту же область памяти, что и «a» или «b», поэтому компилятор должен вставить дополнительные загрузки / хранилища, чтобы беспокоиться об этом случае.
Это тривиальный пример, но более сложные демонстрируют похожее поведение.Для простых типов и даже небольших структур передача по значению обычно приводит к более быстрому коду.