1

Как говорится в названии, мне любопытно узнать о различии между «call-by-reference» и «call-by-value-return», , Я читал об этом в какой-то литературе и пытался найти дополнительную информацию в Интернете, но я только нашел сравнение «call-by-value» и «call-by-reference».В чем разница между вызовом по ссылке и обратным вызовом по умолчанию

Я понимаю разницу на уровне памяти, но не на «концептуальном» уровне, между двумя.

Вызываемая подпрограмма будет иметь свою собственную копию фактического значения параметра, с которой будет работать, но при завершении выполнения скопирует новое локальное значение (привязанное к формальному параметру) обратно к фактическому параметру вызывающего.

Когда вызов по значению-возврат фактически предпочтительнее выше «вызов по ссылке»? Любой пример сценария? Все, что я вижу, это то, что требуется дополнительное время памяти и времени выполнения из-за копирования значений в ячейках памяти.

В качестве побочного вопроса используется «call-by-value-return», реализованный на «современных» языках?

+0

вы должны исследовать больше, вы найдете тонны информации на этом. также будут примеры, которые покажут вам полезность любого из этих методов. вы действительно просто должны найти его – x4rf41

ответ

2

Вызов по значению возврата из Wikipedia:

Этот вариант привлекла к себе внимание в многопроцессорных контекстах и ​​удаленного вызова процедуры: если параметр вызова функции является ссылкой, которая может быть доступна другим поток выполнения, его содержимое может быть скопировано в новую ссылку, которая не является; когда вызов функции возвращается, обновленное содержимое этой новой ссылки копируется обратно к исходной ссылке («восстановлено»).

Таким образом, в более практическом плане вполне возможно, что переменная находится в некотором нежелательном состоянии в середине выполнения функции. При параллельной обработке это проблема, поскольку вы можете попытаться получить доступ к переменной, пока она имеет это значение. Копирование его во временное значение позволяет избежать этой проблемы.

В качестве примера:

policeCount = 0 

everyTimeSomeoneApproachesOrLeaves() 
    calculatePoliceCount(policeCount) 

calculatePoliceCount(count) 
    count = 0 
    for each police official 
    count++ 

goAboutMyDay() 
    if policeCount == 0 
    doSomethingIllegal() 
    else 
    doSomethingElse() 

Предположим everyTimeSomeoneApproachesOrLeaves и goAboutMyDay выполняются параллельно.

Итак, если вы пройдете по ссылке, вы можете получить policeCount сразу после того, как оно было установлено в 0 в calculatePoliceCount, даже если вокруг есть полицейские, тогда вы закончите делать что-то незаконное и, вероятно, отправитесь в тюрьму, или, по крайней мере, кашлять немного денег за взятку. Если вы пройдете по возврату значения, этого не произойдет.

Поддерживаемые языки?

В моем поиске я обнаружил, что Ada и Fortran поддерживают это. Я не знаю других.

+0

Очень красиво объяснено! Спасибо за ваш ответ! – Anders

Смежные вопросы