Передать по ссылке дороже, чем пройти по значению

Есть ли случай, когда pass-by-reference дороже, чем pass-by-value в C ++? Если да, то в чем дело?

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

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

См. « Параметры вызова Boost» .

Класс template call_traits инкапсулирует «лучший» метод для передачи параметра некоторого типа T в или из функции и состоит из набора typedefs, определенного в таблице ниже. objective call_traits – обеспечить, чтобы такие проблемы, как «ссылки на ссылки», никогда не возникали, и что параметры передаются наиболее эффективным образом.

Вы можете прочитать эту статью «Хотите скорость? Передайте по значению» о копировании elision и RVO (Return by Value Optimization). В нем объясняется, что ссылки иногда мешают компилятору их выполнять.

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

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