2012-01-13 2 views
13

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

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

+0

Хотя я был в состоянии принять ваш ответ, мне пришлось ждать еще несколько часов, чтобы получить награду. Спасибо за отличный ответ, и щедрость ваша, конечно! – mort

+0

А, я не знал этого о системе награды. Хорошо знать! – mydogisbox

ответ

17

Примеры взяты из here.

Главный код:

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

Ссылка передана. Эффективно переменная в функции такая же, как и внешняя.

Вызов с Copy/Restore:

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 
} 

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

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

+0

вы использовали '& y' в обоих из них – CodyBugstein

+0

В примере« Call with Copy/Restore »он печатает« 0 », а не« 2 ». – Carlochess

+1

@Carlochess, на каком языке, который поддерживает копирование/восстановление, вы использовали? – mydogisbox

8

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

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

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