Есть ли случай, когда пересылка по ссылке дороже, чем пропускная способность на C++? Если да, то в чем дело?Передать по ссылке более дорогостоящий, чем передать по значению
ответ
Предпочитает передавать примитивные типы (int, char, float, ...) и структуры POD, которые дешево копировать (Point, complex) по значению.
Это будет более эффективно, чем косвенность, требуемая при передаче по ссылке.
См. Boost's Call Traits.
Шаблон класса
call_traits<T>
инкапсулирует «лучший» метод, чтобы передать параметр некоторого типа Т или из функции, и состоит из набора определений типов, как определено в приведенной ниже таблице. Цельcall_traits
состоит в том, чтобы гарантировать, что такие проблемы, как «ссылки на ссылки», никогда не происходят и что параметры передаются наиболее эффективным образом.
Да, доступ к аргументу, переданному по ссылке, может потребовать больше уровней косвенности, чем аргумент, переданный по значению. Кроме того, он может быть медленнее, если размер аргумента меньше размера одного указателя. Конечно, все предполагают, что компилятор не оптимизирует его.
Вы можете прочитать эту статью "Want speed ? Pass by value" о copy elision и RVO (Return by Value Optimization). В нем объясняется, что ссылки иногда мешают компилятору их выполнять.
Компилятор может оптимизировать передачу примитивного типа путем ссылки на простое прохождение по значению, если тип того же размера или меньше, чем размер ссылки/указателя. Нет никакой гарантии, что компилятор сделает это, поэтому, если у вас есть выбор, передайте примитивные типы по значению. Тем не менее, в шаблоном коде вам часто приходится проходить по ссылке - рассмотрите push_back вектора, который принимает ссылку на const. Если у вас есть вектор ints, вы передадите ссылку на примитивный тип. В этой ситуации вы надеетесь, что компилятор оптимизирует это, заменив ссылку на значение. Так как вектор может хранить большие типы, однако, прием ссылки const является наилучшим выбором.
«Компилятор может оптимизировать ...» до тех пор, пока вызываемый пользователь не изменит ссылку referand или не прочитает его после вызова любого кода, который может его изменить. Но, конечно, в тех случаях, когда это происходит, вы, надеюсь, не задавали бы вопрос «который дороже», скорее «что правильно» :-) Неловкие - это случаи, когда вы думаете, что компилятор может оптимизировать, но на самом деле это не может, потому что вы упустили из-за чего-то, что это должна быть ссылка (правила сглаживания - основная причина сюрпризов). –
Итак, как можно узнать, оптимизирует ли его компилятор? – Arthur
Посмотрев на двоичный код –