2012-01-13 15 views
13

Jaka jest różnica między połączeniem przez odwołanie a kopiowaniem/przywracaniem?Jaka jest różnica między wywołaniem przez odniesienie a kopiowaniem/przywracaniem?

Tło: Obecnie studiuję systemy rozproszone. Odnosząc się do przekazywania parametrów referencyjnych dla zdalnych wywołań procedur, książka stwierdza, że: "wywołanie przez odniesienie zostało zastąpione przez kopiowanie/przywracanie, chociaż nie zawsze jest to identyczne, jest wystarczająco dobre". Rozumiem, jak działa wywoływanie przez odwołanie i kopiowanie/przywracanie, ale nie widzę, gdzie może być różnica w wyniku?

+0

Chociaż byłem w stanie zaakceptować twoją odpowiedź, musiałem czekać jeszcze kilka godzin, aby móc nagrodzić nagrodę. Dzięki za wspaniałą odpowiedź, a nagroda jest oczywiście Twoja! – mort

+0

Ah, nie wiedziałem o systemie nagród. Dobrze wiedzieć! – mydogisbox

Odpowiedz

17

Przykłady z here.

Kod Główny:

#include <stdio.h> 

    int a; 

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

Połącz przez. Wartość:

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 
} 

wartość jest przekazywana i nie ma wpływu na wartość zmiennej przekazanej w

połączeń według pozycji:

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 
} 

Referencja jest przekazywana. Skutecznie zmienna w funkcji jest taka sama, jak ta na zewnątrz.

połączeń z Kopiuj/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 
} 

wartość jest przekazywana i nie ma wpływu na wartość zmiennej przekazanej w do końca funkcji, w tym momencie wartość końcowa zmienna funkcyjna jest przechowywana w zmiennej przekazanej.

Podstawowa różnica między wywołaniem przez odniesienie i kopiowaniem/przywracaniem polega na tym, że zmiany dokonane w zmiennej funkcji nie pojawią się w przekazanej zmiennej, dopóki po zakończeniu funkcji nie zostaną wyświetlone zmiany wywołania przez odniesienie.

+0

użyłeś '& y' w obu z nich – CodyBugstein

+0

W przykładzie" Call with Copy/Restore ", wypisuje" 0 ", a nie" 2 ". – Carlochess

+1

@Carlochess, jakiego języka używasz do kopiowania/przywracania? – mydogisbox

8

Wywołanie za pomocą funkcji Kopiuj/Przywróć jest specjalnym przypadkiem wywołania po odesłaniu, jeśli podane odwołanie jest unikalne dla osoby dzwoniącej. Wynik końcowy dla wartości odniesienia nie zostanie zapisany do końca funkcji.

Ten typ wywołania jest przydatny, gdy metoda w wywoływarce RPC jest wywoływana przez odniesienie. Rzeczywiste dane są wysyłane do serwera, a ostateczny wynik zostanie wysłany do klienta. Spowoduje to zmniejszenie ruchu, ponieważ serwer nie aktualizuje za każdym razem odwołania.

Powiązane problemy