Подтвердить что ты не робот

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

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

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

4b9b3361

Ответ 1

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

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

#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
}

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

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

Ответ 2

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

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