Передача по значению или передача по ссылке - PullRequest
3 голосов
/ 08 декабря 2011
void Subroutine1(int Parameter1)

void Subroutine2(const int &Parameter1) 

В подпрограмме 1 мы должны получить копию параметра, в то время как в подпрограмме 2 нам не нужно делать копию, что может сэкономить некоторые издержки.

На практике подпрограмма1, кажется, используется чаще, чем другая. Почему это так?

Ответы [ 7 ]

5 голосов
/ 08 декабря 2011

На практике Подпрограмма1, кажется, используется чаще, чем другая. Почему это так?

Поскольку копировать int лучше, чем создавать ссылку (или указатель) и затем обращаться к ней.

В более общем смысле все примитивные типы должны передаваться по значению.

2 голосов
/ 08 декабря 2011

Потому что, когда вы имеете дело с примитивными типами (такими как int), передача по ссылке фактически хуже с точки зрения производительности, чем передача по значению. Он также ничего вам не предлагает.

1 голос
/ 08 декабря 2011

Один передает int, другой передает ссылку. Как уже говорили другие, создание и доступ к ссылке на int - не большая разница, чем просто копирование int.

(отредактировано согласно правильному комментарию)

0 голосов
/ 08 декабря 2011

Во-первых, для типа int передача по значению происходит быстрее, чем передача по ссылке. Но для вашего собственного класса и структуры передача по ссылке быстрее.

Разница в накладных расходах между этими двумя методами для примитивных типов на самом деле очень и очень мала, вы можете игнорировать ее в большинстве случаев.

На мой взгляд, const ref параметра примитивного типа бесполезен для нормальных функций. И это делает код немного неясным, поэтому не используйте его.

0 голосов
/ 08 декабря 2011

Передача по ссылке в некоторой степени подразумевает, что вызываемый абонент может видоизменять все, на что ссылаются, и эта мутация действует в вызывающем абоненте. Если это так, вы, вероятно, хотите обернуть int объект и передать его в функцию по ссылке. Это обеспечивает более явный код.

0 голосов
/ 08 декабря 2011

Для примитивных типов данных (таких как int, double, char), которые обычно имеют меньший размер, первый случай обычно быстрее (доступность) и дешевле по сравнению со вторым. Помните, что ссылки реализованы более или менее аналогично указателям.

С другой стороны, если Parameter1 не будет изменен, то лично я выберу 3-й вариант,

void Subroutine3(const int Parameter1);
0 голосов
/ 08 декабря 2011

Передача по ссылке (почти всегда) осуществляется путем передачи указателя.Это означает, что для простых типов, таких как int, вторая версия может быть менее эффективной - передача указателя имеет более или менее ту же стоимость, что и передача простого объекта, а затем функция должна разыменовать этот указатель.

...