Передать по ссылке дороже, чем передать по значению - PullRequest
9 голосов
/ 21 января 2010

Есть ли случай, когда передача по ссылке обходится дороже, чем передача по значению в C ++? Если это так, что бы это был за случай?

Ответы [ 4 ]

15 голосов
/ 21 января 2010

Предпочитают передавать примитивные типы (int, char, float, ...) и структуры POD, которые дешевы для копирования (Point, complex) по значению.

Это будет более эффективно, чем перенаправление, требуемое припередача по ссылке.

См. Характеристики вызовов Boost .

Класс шаблона call_traits<T> инкапсулирует «лучший» метод для передачи параметра некоторого типа Tв или из функции и состоит из набора typedef, определенных в таблице ниже.Цель call_traits состоит в том, чтобы такие проблемы, как «ссылки на ссылки», никогда не возникали и чтобы параметры передавались наиболее эффективным способом.

7 голосов
/ 21 января 2010

Вы можете прочитать эту статью "Хотите скорость? Передайте по значению" о разрешении копирования и RVO (Оптимизация возврата по значению). Это объясняет, что ссылки иногда мешают компилятору делать это.

4 голосов
/ 21 января 2010

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

1 голос
/ 21 января 2010

Компилятор может оптимизировать передачу примитивного типа по ссылке на простую передачу по значению, если тип имеет такой же размер или меньше размера ссылки / указателя. Нет никакой гарантии, что компилятор сделает это, поэтому, если у вас есть выбор, передайте примитивные типы по значению. Однако в шаблонном коде вам все равно часто приходится передавать по ссылке - рассмотрите вектор push_back, который принимает константную ссылку. Если у вас есть вектор целых, вы будете передавать ссылку на примитивный тип. В этой ситуации вы надеетесь, что компилятор оптимизирует это, заменив ссылку на значение. Так как вектор может хранить большие типы, лучше всего принимать константную ссылку.

...