#c
#c
Вопрос:
Я пытаюсь понять разницу между передачей по значению и передачей по ссылке. Когда передача по ссылке будет выполняться быстрее, чем передача по значению (и наоборот)? Кроме того, в каких случаях передача по ссылке будет использовать меньше памяти, чем передача по значению (и наоборот)?
Комментарии:
1. Передача по ссылке более эффективна, потому что вы избегаете создания временного объекта в памяти, поэтому нет выделения или выделения памяти, вы просто передаете адрес вашего уже созданного объекта. (но вы должны помнить, что, передавая по ссылке, вы изменяете исходную переменную, и снова вы можете
const
указать свой аргумент, чтобы избежать модификации внутри функции). передача по значению означает, что вы создаете временную копию, поэтому компилятору приходится выполнять больше работы, создавать временный объект и передавать в функцию только для уничтожения в конце функции.
Ответ №1:
Когда передача по ссылке будет выполняться быстрее, чем передача по значению (и наоборот)?
Это может быть сложный вопрос, поскольку он часто сводится к «это зависит».
Передача по ссылке позволяет избежать создания копии параметра. Для простых объектов копирование обходится не так дорого (возможно, не дороже, чем использование ссылки), но для больших объектов это может быть. Если вы используете чужой класс, вам, возможно, придется прибегнуть к тестированию производительности, чтобы получить представление об экономии производительности за счет отказа от копирования.
Передача по ссылке также добавляет уровень косвенности всякий раз, когда требуется значение параметра. Это означает, что использование параметра происходит медленнее. Чем чаще вы используете параметр, тем более выражен этот эффект. Опять же, измерьте, чтобы узнать размер эффекта, но я понимаю, что за пределами критически важных для производительности частей вашего кода дополнительный уровень косвенности обычно незначителен.
Кроме того, в каких случаях передача по ссылке будет использовать меньше памяти, чем передача по значению (и наоборот)?
Это довольно просто. Когда вы передаете по значению, вы помещаете значение в стек. Требуемое пространство — это размер объекта. При передаче по ссылке вы помещаете указатель в стек. Требуемое пространство равно размеру указателя. Если sizeof(argument) < sizeof(argument*)
затем передача по значению занимает меньше памяти, тогда как передача по ссылке занимает меньше памяти, когда sizeof(argument) > sizeof(argument*)
.
В типичной 64-разрядной системе передача по значению использует меньше памяти для большинства базовых типов (таких как char
, short
, int
, и float
) и является связующим звеном для большинства других (таких как long long
и double
, но не для long double
). Имейте в виду, что это типично, не предусмотрено стандартом.
Как правило, для long
и меньше, передавайте по значению, если вам не нужна ссылка (поскольку предполагается, что функция изменяет предоставленный аргумент). Для объектов, которые поддерживают несколько фрагментов данных, передавайте по ссылке, если вам не нужна копия. Класс, который задокументирован как «дешевый для копирования», вероятно, следует отнести к первой категории (передача по значению), независимо от вашего понимания того, сколько данных он поддерживает.
Ответ №2:
Если вы передаете по ссылке, вы можете изменить переданную переменную. Однако, если вы передаете по значению, вы не сможете этого сделать. Массивы являются исключением из этого правила, вы можете передавать их так, как хотите. Надеюсь, это помогло!
Комментарии:
1. Технически вы не можете передать массив по значению, только по ссылке. Однако вы можете передать указатель, на который он с удовольствием распадается по значению.
2. Этот ответ не отвечает на заданный вопрос, вопрос о скорости и памяти.