В чем разница между вызовом по ссылке и копированием / восстановлением - PullRequest
14 голосов
/ 13 января 2012

Какая разница в результатах между вызовом по ссылке и копированием / восстановлением?

Справочная информация: В настоящее время я изучаю распределенные системы.Что касается передачи опорных параметров для удаленных вызовов процедур, в книге говорится, что «вызов по ссылке был заменен копированием / восстановлением. Хотя это не всегда идентично, это достаточно хорошо».Я понимаю, как в принципе работают вызов по ссылке и копирование / восстановление, но я не вижу, где может быть разница в результате?

Ответы [ 2 ]

18 голосов
/ 15 января 2012

Примеры взяты из здесь .

Основной код:

#include <stdio.h>

  int a;

  int main() {
      a = 3;
      f( 4, &a );
      printf("&#37;d\n", a);
      return 0;
  }

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

f(int x, int &y){
    // x will be 3 as passed argument
    x += a;
    // now a is added to x so x will be 6
    // but now nothing is done with x anymore
    a += 2*y;
    // a is still 3 so the result is 11
}

Значение передается и не влияет на значение переменной, переданной.

Позвоните по ссылке:

f(int x, int &y){
    // x will be 3 as passed argument
    x += a;
    // now a is added to x so x will be 6
    // but because & is used x is the same as a
    // meaning if you change x it will change a
    a += 2*y;
    // a is now 6 so the result is 14
}

Передается ссылка. Фактически переменная в функции такая же, как и внешняя.

Вызов с копированием / восстановлением:

int a;
void unsafe(int x) {
    x= 2; //a is still 1
    a= 0; //a is now 0
}//function ends so the value of x is now stored in a -> value of a is now 2

int main() {
    a= 1;
    unsafe(a); //when this ends the value of a will be 2
    printf("%d\n", a); //prints 2
}

Значение передается и не влияет на значение переменной, переданной в конец функции, после чего окончательное значение переменной функции сохраняется в переданной переменной.

Основное различие между вызовом по ссылке и копированием / восстановлением заключается в том, что изменения, внесенные в переменную функции, не будут отображаться в переданной переменной до тех пор, пока не завершится функция, а изменения вызова по ссылке будут видны немедленно. 1029 *

8 голосов
/ 28 апреля 2013

Call by Copy / Restore - это особый случай вызова по ссылке, когда предоставленная ссылка является уникальной для вызывающего абонента.Окончательный результат по ссылочным значениям не будет сохранен до конца функции.

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

...