Есть ли что-то, что можно получить, используя (const int & var) формальные параметры вместо (const int var)? - PullRequest
0 голосов
/ 25 августа 2011

Есть ли что-нибудь, что можно получить, используя const int &var формальные параметры вместо const int var?

Я знаю преимущество в больших структурах, но для POD указатель часто имеет размер, равный размеру фактических данных,Поэтому я думаю, что ответом будет «Нет преимущества».Но я думаю, что, возможно, семантика передачи по значению копируется один раз в стек и снова в область вне стека для более легкой ссылки (скажем, в регистр).А может и нет.На самом деле может быть лучше передать по значению

http://www.learncpp.com/cpp-tutorial/73-passing-arguments-by-reference/

Поскольку ссылки обычно реализуются в C ++ с использованием указателей, а разыменование указателя происходит медленнее, чем прямой доступ к немудоступ к значениям, переданным по ссылке, медленнее, чем доступ к значениям, переданным по значению.

Но это возвращает нас к тому, что я говорил о копировании обратно из стека.Я просто параноик, верно?Такое поведение беспокоит компилятор, а не меня.

Я мог бы пошагово собрать сборку, которую я знаю, но, ну, поиск в Google быстрее, и она оказалась пустой.

Ответы [ 2 ]

3 голосов
/ 25 августа 2011

Учтите это:

нереференсного

  • Выделите int в стеке
  • Скопировать значение в стек
  • Вызовите функцию как обычно
  • Использовать переменную в стеке

Ссылка

  • Выделить указатель в стеке
  • Копировать адрес int в стек
  • Вызовите функцию как обычно
  • Разыменование переменной в стеке (возможно, несколько раз в одной и той же функции)
  • Используйте переменную

Немного медленнее использовать эталонную версию. В общем, пусть компилятор беспокоится об этом. Если это значение только для чтения, просто присвойте ему обычный старый int. Если вам нужно изменить значение вызывающего, используйте ссылку или указатель.

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

1 голос
/ 25 августа 2011

Когда вы передаете ссылку, вы все равно копируете значение ссылки.Когда вы используете его, вы тратите несколько циклов на косвенность, но кроме этого нет разницы в производительности.

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

...