Влияет ли, передаёшь ты в функцию аргументы по ссылке или по значению, на производительность и память?
Просто интересно: если функция, допустим, будет только просматривать значения аргументов, но никак не будет изменять, есть смысл передавать их в функцию именно по ссылке ради уменьшения ресурсоёмкости программы, или это глупость? Типа когда ты передаёшь аргументы по значению, копию, во-первых, нужно создать, а во-вторых, копия занимает место. Но с другой стороны так вродь никто не делает.
Влиют ли тут типы данных? Может, например, на просто int без разницы, а вот передача по значению вектора из пары миллионов элементов затратна.
Вопрос касается не только C++, а в принципе всех языков программирования.
Вы демонстрируете знания, достаточные для ответа на этот вопрос (насчет конструкторов копирования, например) - но почему-то все равно задаете этот вопрос.
Ну, насчет языков программирования, разумеется, можно уточнить, что в каждом это сделано по-своему. Часто по умолчанию работает copy-on-demand. Но и это может зависеть от конкретной реализации языка.
Слишком общий вопрос, общий ответ на который автор и так знает. Смысл?
По ссылке дешевле во многих случаях. Ибо передача по значению создает копию. Поэтому передача большого вектора по значению будет очень дорогой.
В целом, в С++ хорошее правило - передавать большие переменные как const &.
Но для мелких типов, вроде int, передавать по ссылке может быть даже дороже, ибо и ссылка и значение тупо помещаются в регистр. Но ссылку надо будет еще разыменовывать, чтобы прочитать значение из памяти, а значение из регистра компилятор может даже не сохранять в память.
С другой стороны, компилятор может наоптимизировать и даже ссылка на int будет не дороже копии int.
Сразу говорить про все языки программиования нельзя. В некоторых языках вообще все передается по ссылке, в других вообще нет разницы для мелких типов.
Если копию создавать дорого, то тогда передача по ссылке будет дешевле.
Если indirection и необходимость разыменования указателей дороже, чем созданние копии, то передача по значению будет дешевле.
Ссылка тоже занимает место, так что в случае int и других маленьких объектов (которые влезают в машинное слово) дешевле передавать значение (как по памяти, так и по времени).
Да и выделение/освобождение памяти в куче дороже, чем выделение/освобождение памяти на стеке. (зато меньше риск получить висячий указатель или stack overflow)